数据类型中的Monadic操作?

时间:2017-02-23 09:40:27

标签: haskell operators monads

我在Haxl我正在使用的库中遇到:>>=。我不确定这与>>=运算符有什么不同?

例如:

data MyType a = MyType a :>>= (a -> Int)

此操作究竟在MyType中做了什么?

这是它在Haxl中使用的背景:

newtype GenHaxl u a = GenHaxl { unHaxl :: Env u -> IORef (RequestStore u) -> IO (Result u a) } --|| u is the env, a is the result

data Result u a
  = Done a
    | Throw SomeException
    | Blocked (Cont u a)

data Cont u a
  = Cont (GenHaxl u a)
    | forall b. Cont u b :>>= (b -> GenHaxl u a)
    | forall b. (Cont u (b -> a)) :<*> (Cont u b)
    | forall b. (b -> a) :<$> (Cont u b)

1 个答案:

答案 0 :(得分:1)

它只是运算符形式的Cont u a类型的构造函数。它在您在问题中包含的代码片段中定义。

Cont u a

Cont (GenHaxl u a)

forall b. (:>>=) (Cont u b) (b -> GenHaxl u a)

forall b. (:<*>) (Cont u (b -> a)) (Cont u b)

forall b. (:<$>) (b -> a) (Cont u b)

最后三个案例是递归的,因为他们提到了Cont u ...。在代码中,toHaxlCont及其符号结构折叠为实际值,方法是通过应用关联来解释:>>=:<*>:<$> >>=(或>=>)等。