gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:16:26 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com