在数据类型构造函数的上下文中理解不同的 monadic 和 applicative binds/combinators?
Understanding different monadic and applicative binds/combinators in the context of a data type constructor?
我得到了以下代码,我正在努力解决:
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)我说的对吗:
a) MyExample (CustomMonad e i)
正在用 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
) 中?
c) forall b. (MyExample e (b -> a)) :<*> (MyExample eb)
正在接受一个由值 e
和函数 (b -> a)
构造的 MyExample
并执行 某种 的应用组合器操作 MyExample e b
?
d) forall b. (b -> a) :<$> (MyExample e b)
正在将一些结果从 (MyExample e b)
传递给函数 (b -> a)
此外,我说 forall b
的使用确保 b
在整个操作过程中是同一类型对吗?
:>>=
实际上并没有对其参数做任何事情;它只是创建了一个类型为 MyExample e i
的新值,稍后您可以将其 解释为 作为对 >>=
的调用,但实际上您可以使用不同的翻译。
我得到了以下代码,我正在努力解决:
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)我说的对吗:
a) MyExample (CustomMonad e i)
正在用 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
) 中?
c) forall b. (MyExample e (b -> a)) :<*> (MyExample eb)
正在接受一个由值 e
和函数 (b -> a)
构造的 MyExample
并执行 某种 的应用组合器操作 MyExample e b
?
d) forall b. (b -> a) :<$> (MyExample e b)
正在将一些结果从 (MyExample e b)
传递给函数 (b -> a)
此外,我说 forall b
的使用确保 b
在整个操作过程中是同一类型对吗?
:>>=
实际上并没有对其参数做任何事情;它只是创建了一个类型为 MyExample e i
的新值,稍后您可以将其 解释为 作为对 >>=
的调用,但实际上您可以使用不同的翻译。