2017-01-23 11 views
0

나는 주위에 내 머리를 얻으려고 노력하고 다음 코드 조각을, 주어진했습니다데이터 형식 생성자의 컨텍스트에서 다른 모나드 및 적용 가능한 바인드/결합자를 이해하고 있습니까?

data MyExample e i = MyExample (CustomMonad e i) 
    | forall b. MyExample e b :>>= (b -> CustomMonad e b) 
    | forall b. (MyExample e (b -> a)) :<*> (MyExample e b) 
    | forall b. (b -> a) :<$> (MyExample e b) 

1)

단항 반대로 :>>=, :<*>:<$>가 다르게합니까 무엇 바인딩 >>=

exampleFunction :: Int -> Maybe Int 
exampleFunction el = Just (el + 100) 
main = do 
    result <- exampleFunction >>= exampleFunction 21 

실용적 콤비 <*><$>

exampleFunction :: Int -> Maybe Int 
exampleFunction el = Just el 
main = do 
result <- pure exampleFunction <$> (+) <*> (ExampleType 2) <*> (ExampleType 4) 

2) 바로 말하는 I 오전 다음

A) MyExample (CustomMonad e i) 전자와 CustomMonad 유형을 건설하고 난 다음 MyExample 맥락에서이 포장?

b) forall b. MyExample e b :>>= (b -> CustomMonad e b)(MyExample e i)을 취한 다음 b를 취하여 (CustomMonad e b)을 구성하는 함수 (b -> CustomMonad e b)에 입력합니까? forall b. (MyExample e (b -> a)) :<*> (MyExample eb)MyExample가 값 e 및 기능 (b -> a)로 구성하고 MyExample e b 일부 실용적 연결자 동작의 종류를수행 복용

c)?

d) forall b. (b -> a) :<$> (MyExample e b) I는 forall b의 사용 b 조작 걸쳐 동일한 유형 인 것을 보장한다 말하는 바로 부가 기능 (b -> a)

(MyExample e b)로 일부 결과를 전달하고 있는가?

답변

2

:>>= 실제로 인수가없는 것은 아닙니다. MyExample e i의 새 값을 만들고 나중에 으로 해석하면 >>=에 대한 호출로을 호출 할 수 있지만 실제로는 다른 인터프리터를 사용하여 원하는대로 수행 할 수 있습니다.