数据类型中的 Monadic 操作?
Monadic operations within data type?
我在使用的 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)
它只是 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
,它通过解释 :>>=
、:<*>
和 :<$>
并应用相关联的方法将 Cont
及其符号结构折叠成实际值>>=
(或>=>
)等
我在使用的 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)
它只是 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
,它通过解释 :>>=
、:<*>
和 :<$>
并应用相关联的方法将 Cont
及其符号结构折叠成实际值>>=
(或>=>
)等