我偶尔在代码中遇到一个类似于monad的模式,但不会保持一致的类型>>=.
这是我能提出的最简单的例子:
(首先是一些类型级的布尔值:
data TyT = TyT
data TyF = TyF
class TyOr a b c | a b -> c
instance TyOr TyF TyF TyF
-- rest similarly
Run Code Online (Sandbox Code Playgroud)
)
现在这里是我们的"monad"类型构造函数:
data Marked p a = Marked a
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
对于给定的p,Marked p是一个* -> *非常像mmonad中的行为,但是当我们定义"bind"时,就像接下来发生的那样:
(>>%) :: (TyOr p q r) => Marked p a -> (a -> Marked q b) -> Marked r b
(Marked x) >>% f = Marked …Run Code Online (Sandbox Code Playgroud)