mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 12:14:43 +00:00
1.6 KiB
1.6 KiB
alstruct
代数的構造を表すトレイトや、それにかかるパッチを提供するモジュール。
- member
BinOp
BinOp Op: Kind 2 = Subsume Op(Self, Self.ReturnTypeOf Op), Additional: {
.ReturnTypeof = TraitType -> Type
}
Nat <: BinOp Add
assert Nat.ReturnTypeof(Add) == Nat
assert Nat.ReturnTypeof(Sub) == Int
assert Nat.ReturnTypeof(Mul) == Nat
assert Nat.ReturnTypeof(Div) == Positive Ratio
SemiGroup
SemiGroup Op: Kind 2 = Op(Self, Self)
IntIsSemiGroupAdd = Patch Int, Impl := SemiGroup Add
Int <: SemiGroup Add
Functor
## * Identity law: x.map(id) == x
## * Composition law: x.map(f).map(g) == x.map(f.then g)
Functor = Trait {
.map|T, U: Type| = (Self(T), T -> U) -> Self U
}
Applicative
## * Identity law: x.app(X.pure(id)) == x
Applicative = Subsume Functor, Additional: {
.pure|T: Type| = T -> Self T
.app|T, U: Type| = (Self(T), Self(T -> U)) -> Self U
}
Monad
Monad = Subsume Applicative, Additional: {
.bind|T, U: Type| = (Self(T), T -> Self U) -> Self U
}