2017-02-23 2 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

Извините, что я идиот, я неправильно понял – 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 сворачивается Cont и его символическая структура в фактические значения путем интерпретации :>>=, :<*> и :<$> с применением соответствующего >>= (или >=>) и т.д.

+0

Спасибо, я привык видеть операторов, определенных в классах, а не типа конструкторов. :-) –

+0

Конечно, я тоже смущаюсь :), но как только вы познакомитесь с этим способом использования операторов, вы, вероятно, найдете его полезным в некоторых случаях. – jakubdaniel