继this的答案,我已经实现了一个通用的升降功能在我的程序:了解Monad'>> ='函数中的所有内容吗?
liftTupe :: (x -> c x) -> (a, b) -> (c a, c b) --This will error
liftTuple :: (forall x. x -> c x) -> (a, b) -> (c a, c b)
我明白了,在这种情况下,forall
正在使x
是任何类型的([]
,Maybe
等。) 。
我现在正在研究中的单子的>>=
定义:
class Applicative m => Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
我无法理解这样的forall
在函数定义中的作用是什么?与liftTuple
不同,它不是绑定到特定功能(x -> c x
)?
不知道为什么所有的答案都这么罗嗦。一句话:你是对的;它没有改变任何东西,只是在那里明确。 – Ryan
'forall a b。 <..>'在类型'>> ='* *'中*绑定到特定函数 - 函数m a - >(a - > m b) - > m b'。你也可以有一个没有函数的'forall',例如'[] :: forall a。 [a]','empty :: forall f a。备选f => f a'。 – user2407038
@Ryan当我得到答案时:“因为一切都是隐含合格的。”我的后续问题通常是“为什么?”。 – ThreeFx