我已经获得了以下代码,我正试图解决这个问题:
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
在整个操作过程中是同一类型?
答案 0 :(得分:2)
:>>=
实际上并没有对其论点做任何事情;它只是创建了一个MyExample e i
类型的新值,您可以稍后解释作为对>>=
的调用,但您可以使用不同的解释器执行任何您想要的操作。