我很困惑为什么我在GHCi中得到这个
:t sequence [Just,Just] sequence [Just, Just] :: a -> [Maybe a]
详细说明,我可以理解,sequence [Just 1, Just 2] :: Num a => Maybe [a]
因为在查看序列的类型时
sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)
很明显,此函数采用monadic值的集合并返回集合的单个monadic值.因此,当我们打电话sequence [Just 1, Just 2]
,我们应该取回Just
的[1,2]
.接下来那个想法,不应该sequence [Just, Just]
单回Just
?
谢谢.
第二个sequence
在另一个monad中工作.
为了第一:
sequence [Just 1, Just 2]
我们有这个Just 1 :: Maybe a
,这是Maybe
monad中的一个值.具体而言,该类型[Maybe a]
是针对匹配t (m b)
所要求的顺序,我们得到t ~ []
,m ~ Maybe
,b ~ a
-因此Maybe
单子.
对于第二个:
sequence [Just, Just]
我们有Just :: a -> Maybe a
.这是哪个monad?现在的类型[a -> Maybe a]
是针对匹配t (m b)
,我们得到t ~ []
,m ~ (->) a
,b ~ Maybe a
-因此我们现在在工作的(->) a
单子,而不再是Maybe
一个.
在这个与(->) a
monad同构的Reader a
monad中,我们有例如
sequence [f, g, h] = \x -> [f x, g x, h x]
实际上,使用(->) a
monad的计算是"读取类型的隐式参数"的计算a
.的sequence
功能只是简单地将这样的计算(列表[(->) a b]
,即,[a -> b]
)成一个单一的计算,读取隐含参数只是一次,并产生与所有的结果(列表(->) a [b]
,即,a -> [b]
).