在数据类型构造函数的上下文中理解不同的monadic和applicative绑定/组合器?

时间:2017-01-23 14:23:18

标签: haskell types monads applicative

我已经获得了以下代码,我正试图解决这个问题:

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):>>=:<*>:<$>做的不同,而不是

Monadic bind >>=

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)我是否正确地说:

a)MyExample (CustomMonad e i)正在使用e和i构建CustomMonad类型,然后将其包含在MyExample上下文中?

b)forall b. MyExample e b :>>= (b -> CustomMonad e b)正在接受(MyExample e i),然后将b输入到构建b -> CustomMonad e b的函数((CustomMonad e b))中?

c)forall b. (MyExample e (b -> a)) :<*> (MyExample eb)正在使用值MyExample和函数e构建(b -> a)并执行某种的应用组合子操作使用MyExample e b

d)forall b. (b -> a) :<$> (MyExample e b)将一些结果从(MyExample e b)传递给函数(b -> a)

此外,我是否正确地说使用forall b确保b在整个操作过程中是同一类型?

1 个答案:

答案 0 :(得分:2)

:>>=实际上并没有对其论点做任何事情;它只是创建了一个MyExample e i类型的新值,您可以稍后解释作为对>>=的调用,但您可以使用不同的解释器执行任何您想要的操作。