组合应用函数

Composing applicative functions

请实现函数:

composeApplicative :: (Applicative f) => f (b -> c) -> f (a -> b) -> f (a -> c)

这样:

(composeApplicative f g) <*> x == f <*> (g <*> x)

或者,解释为什么不能这样做?

可以做到:

composeApplicative p q = (.) <$> p <*> q

有关更多信息,read the documentation for Applicative functors,更具体地说,是组成法则。这实际上是一个声明,任何 Applicative 实例,composeApplicative f g <*> x 必须始终等于 f <*> (g <*> x).

作为一个小技术说明,在进行等式推理时,等式的左右两边必须用一个等号分隔 (=)。双等号 (==) 保留给 decidable runtime equality checks.