首页 > 解决方案 > 函数中的“上下文”是什么

问题描述

我正在尝试更熟悉 Haskell(Functor,Monad)。所以我试图理解下面的例子中发生了什么

 sequence:: [f a] -> f [a]
 let list =  [(+2), (*6)]
 let y =  sequence  list

(+2) 中的“f”和 y 的“值”是什么?

标签: haskellmonads

解决方案


的类型sequenceA是:

sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)

(我使用sequenceA它是因为它是更通用的版本——sequence有一个更严格Monad的约束而不是那个Applicative——但就这个答案而言,它并不重要。)

假设您list有类型[Integer -> Integer](为了清楚起见,我专门针对数字)。然后专门从事sequenceAsequenceA list

[Integer -> Integer] -> (Integer -> [Integer])

如果我们以前缀样式编写有趣的(对我们而言)类型构造函数,则对应关系更容易看出:

-- t (           f       a) ->             f ( t       a)
  [] ((->) Integer Integer) -> ((->) Integer ([] Integer))

列表函子[]是可遍历函子(t在 的签名中sequenceA),而来自函子(->) Integer函数Integer是相关的应用函子(f签名中的应用上下文。例如,在结果类型中,你有一个来自s 的函数来生成这样的列表Integer -> [Integer],而不是简单的整数列表。Integer


推荐阅读