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

标签 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)

很明显,这个函数接受一个单子(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/

相关文章:

haskell - 为什么这个表单不违反 `$` 的类型签名?

haskell - 如何将延续单子(monad)分解为左右伴随?

Haskell String-> Int 类型转换

list - 为什么 Haskell 基础库中没有 "non-empty list"类型?

haskell - 如何对复杂数据类型进行自动微分?

haskell - 在我的 Haskell 代码中找不到错误

haskell - 有没有更好的方法将 UTC 时间转换为大纪元时间?

haskell - Monad如何符合函数的组成

haskell - Free Monoid 和 Monoid 之间的主要区别是什么?

haskell - 用于仿射 k 代数计算的库?