我正试图更加熟悉Haskell(Functor,Monad)。所以我试图了解以下示例中发生的事情
sequence:: [f a] -> f [a]
let list = [(+2), (*6)]
let y = sequence list
(+ 2)中的“ f”和y的“值”是什么?
答案 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中的函数来生成整数列表,而没有简单的整数列表。