File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -31,3 +31,21 @@ type IMonoid<'a> =
3131type 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+ *)
Original file line number Diff line number Diff line change @@ -44,3 +44,19 @@ module Add =
4444 member this.Zero = 0 us
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+ }
You can’t perform that action at this time.
0 commit comments