2017-02-23 13 views
0

私は使用しているHaxlライブラリで:>>=を使用しました。これが>>=とどのように違うのかよくわかりません。例えばデータ型内のモナド演算ですか?

:この操作はMyTypeに正確

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

は何をしているのですか?

これは、その文脈が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

申し訳ありませんが、私は間違っています。 – 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) 

又は

のいずれかであります

最後の3つのケースは再帰的であり、Cont u ...と言います。さらに、コードに関連>>=(又は>=>)のアプリケーションと:>>=:<*>、及び:<$>を解釈することによって実際の値にContそのシンボリック構造を折り畳むtoHaxl

+0

ありがとうございます、私はクラスで定義された演算子、型コンストラクタを見て慣れています。 :-) –

+0

もちろん、私はそれも混乱していると思っています:)しかし、あなたはこの演算子を使うこの方法に慣れれば、たぶん便利なことがあるでしょう。 – jakubdaniel

関連する問題