2017-02-23 74 views
0

我在使用的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) 
+0

@ jd823592 Haxl库在问题 – Shersh

+0

已经提到的折叠Cont和它的符号结构成实际值对不起,我是一个白痴,我误解了 – jakubdaniel

回答

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 ...。此外,在代码有toHaxl其通过解释:>>=:<*>,并:<$>与相关联的>>=应用程序(或>=>)等

+0

谢谢,我习惯于在类中定义运算符,而不是类型构造函数。 :-) –

+0

当然,我也觉得它太困惑了:),但是一旦你熟悉了这种使用操作符的方式,你可能会发现它在某些场合很有用。 – jakubdaniel