无法理解序列的类型[Just,Just]

Lim*_* H. 15 haskell

我很困惑为什么我在GHCi中得到这个

:t sequence [Just,Just]
sequence [Just, Just] :: a -> [Maybe a]
Run Code Online (Sandbox Code Playgroud)

详细说明,我可以理解,sequence [Just 1, Just 2] :: Num a => Maybe [a]因为在查看序列的类型时

sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)
Run Code Online (Sandbox Code Playgroud)

很明显,此函数采用monadic值的集合并返回集合的单个monadic值.因此,当我们打电话sequence [Just 1, Just 2],我们应该取回Just[1,2].接下来那个想法,不应该sequence [Just, Just]单回Just

谢谢.

chi*_*chi 24

第二个sequence在另一个monad中工作.

为了第一:

sequence [Just 1, Just 2]
Run Code Online (Sandbox Code Playgroud)

我们有这个Just 1 :: Maybe a,这是Maybemonad中的一个值.具体而言,该类型[Maybe a]是针对匹配t (m b)所要求的顺序,我们得到t ~ [],m ~ Maybe,b ~ a-因此Maybe单子.

对于第二个:

sequence [Just, Just]
Run Code Online (Sandbox Code Playgroud)

我们有Just :: a -> Maybe a.这是哪个monad?现在的类型[a -> Maybe a]是针对匹配t (m b),我们得到t ~ [],m ~ (->) a,b ~ Maybe a-因此我们现在在工作的(->) a单子,而不再是Maybe一个.

在这个与(->) amonad同构的Reader amonad中,我们有例如

sequence [f, g, h] = \x -> [f x, g x, h x]
Run Code Online (Sandbox Code Playgroud)

实际上,使用(->) amonad的计算是"读取类型的隐式参数"的计算a.的sequence功能只是简单地将这样的计算(列表[(->) a b],即,[a -> b])成一个单一的计算,读取隐含参数只是一次,并产生与所有的结果(列表(->) a [b],即,a -> [b]).