函数中的“上下文”是什么

时间:2018-09-12 16:47:27

标签: haskell monads

我正试图更加熟悉Haskell(Functor,Monad)。所以我试图了解以下示例中发生的事情

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

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

1 个答案:

答案 0 :(得分:2)

sequenceA的类型是:

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

(我使用的是sequenceA,因为它是更通用的版本-sequence具有更严格的Monad约束,而不是Applicative一个约束,但是就这个答案而言,没什么大不了的。)

假设您的list的类型为[Integer -> Integer](为了清楚起见,我专门使用数字)。然后sequenceA中的sequenceA list专用于:

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

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

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

列表函子[]是可遍历的函子(在t签名中的sequenceA),而{em> { (->) Integer 函子,是相关的应用函子(签名中的Integer),或者,如果使用标题的语言,则是相关的应用语境。例如,在f结果类型中,您没有Integer -> [Integer] s中的函数来生成整数列表,而没有简单的整数列表。