Skip to content

Commit 113ffcc

Browse files
committed
Add monoidic type
1 parent a1d3e19 commit 113ffcc

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

src/GraphBLAS-sharp/AlgebraicStructures.fs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,21 @@ type IMonoid<'a> =
3131
type ISemiring<'a> =
3232
inherit IMonoid<'a>
3333
abstract Times: ClosedBinaryOp<'a>
34+
35+
// на самом деле должен быть "зависымым типом"
36+
// (если получает ноль, то Zero, иначе Just x)
37+
// но он будет оборачивать 'a только на стороне F#
38+
// => можно сделать специальный статик коснтруктор для инстансов
39+
// (если так делать, то уже не получится оставить его генерик типом)
40+
// (можно в конструктор передавать проверку на ноль первым параметром, тогда норм)
41+
type MonoidicType<'a> =
42+
| Just of 'a
43+
| Zero
44+
45+
(*
46+
мотивация
47+
хотим, чтобы ноль был нулем (даже если он в матрице будет хранится)
48+
и все моноиды, определенные над MonoidicType 'a имели корректную семантику
49+
(если получился 0 и мы сменили моноид, то этот элемент все еще будет нудем в другом моноиде)
50+
то избавимся от кастов
51+
*)

src/GraphBLAS-sharp/Predefined/Monoids/Add.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,19 @@ module Add =
4444
member this.Zero = 0us
4545
member this.Plus = ClosedBinaryOp <@ (+) @>
4646
}
47+
48+
let monoidicFloat =
49+
{ new IMonoid<MonoidicType<float>> with
50+
member this.Zero = Just 0.
51+
member this.Plus =
52+
<@
53+
fun x y ->
54+
match x, y with
55+
| Just x, Just y ->
56+
let result = x + y
57+
if abs result < 1e-16 then Zero else Just result
58+
| Just x, Zero -> Just x
59+
| Zero, Just y -> Just y
60+
| Zero, Zero -> Zero
61+
@> |> ClosedBinaryOp
62+
}

0 commit comments

Comments
 (0)