2017-02-23 5 views
0

Ich bin auf die Verwendung von :>>= in der Haxl Bibliothek, die ich verwende, gestoßen. Ich bin mir nicht sicher, wie sich das vom Operator >>= unterscheidet?Monadische Operationen innerhalb des Datentyps?

Zum Beispiel:

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

Was genau ist dieser Vorgang in MyType tun?

Dies ist der Kontext es in Haxl ist mit:

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 durch Interpretieren Bibliothek bereits in Frage erwähnt – Shersh

+0

Tut mir leid, ich bin ein Idiot, ich missverstanden – jakubdaniel

Antwort

1

Es ist nur ein Konstruktor für die Art Cont u a in Form eines Bedieners. Es ist in dem Code definiert, den Sie in die Frage eingefügt haben.

Cont u a 

entweder

Cont (GenHaxl u a) 

oder

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

oder

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

oder

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

Die letzten drei Fälle sind rekursiv, da sie Cont u ... erwähnen. Ferner ist in dem Code ist es, die toHaxl:>>=, :<*> und :<$> mit Anwendung der zugehörigen >>= (oder >=>) usw. Cont und seine symbolische Struktur in Istwerten faltet

+0

Danke, ich bin es gewohnt zu sehen, Operatoren in Klassen definiert, nicht Typ Konstruktoren. :-) –

+0

Natürlich finde ich es auch verwirrend :), aber sobald du dich mit dieser Art der Verwendung von Operatoren vertraut gemacht hast, wirst du es wahrscheinlich bei einigen Gelegenheiten nützlich finden. – jakubdaniel

Verwandte Themen