我很困惑为什么我在 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)
很明显,这个函数接受一个单子(monad)值的集合并返回该集合的单个单子(monad)值。因此,当我们调用
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
单子(monad)。对于第二个:
sequence [Just, Just]
我们有
Just :: a -> Maybe a
.这是在哪个单子(monad)里?现在输入 [a -> Maybe a]
与 t (m b)
匹配, 我们得到 t ~ []
, m ~ (->) a
, b ~ Maybe a
-- 因此我们现在在 (->) a
工作monad,并且不再在 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]
)。
关于haskell - 无法理解序列的类型 [Just, Just],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34244574/