在数据类型构造函数的上下文中理解不同的 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 的新值,稍后您可以将其 解释为 作为对 >>= 的调用,但实际上您可以使用不同的翻译。