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

时间:2015-12-12 20:22:11

标签: haskell

我很困惑为什么我在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

感谢。

1 个答案:

答案 0 :(得分:24)

第二个 General model: myfit(f) = 4*k*Temp*beta/(m*((2*pi)^4*(f^2-v_0^2)^2+(2*pi*f*beta)^2)) Coefficients (with 95% confidence bounds): beta = 1.35e+04 (-4.909e+09, 4.909e+09) v_0 = 1.31e+04 (-3.802e+08, 3.802e+08) Problem parameters: k = 1.381e-23 m = 1.176e-12 Temp = 295.5 在另一个monad中工作。

第一个:

sequence

我们有sequence [Just 1, Just 2] ,这是Just 1 :: Maybe a monad中的值。具体而言,类型Maybe根据序列的要求与[Maybe a]匹配,我们得到t (m b)t ~ []m ~ Maybe - 因此{{1} } monad。

第二个:

b ~ a

我们有Maybe。这是哪个monad?现在,sequence [Just, Just] 类型与Just :: a -> Maybe a匹配,我们得到[a -> Maybe a]t (m b)t ~ [] - 因此我们现在正在使用{{1} } monad,不再在m ~ (->) a中。

在这个与b ~ Maybe a monad同构的(->) a monad中,我们有例如。

Maybe

实际上,使用(->) a monad的计算是计算"读取Reader a"类型的隐式参数。 sequence [f, g, h] = \x -> [f x, g x, h x] 函数只是将这样的计算列表((->) a,即a)转换为只读取一次隐式参数的单个计算,并生成包含所有结果的列表 (sequence,即[(->) a b])。