2015-07-12 69 views
-6

请执行以下功能:撰写应用性功能

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

这样的:

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

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

+1

'composeApplicative p q =(。)<$> p <*> q' – pyon

+4

这功课吗?你有什么尝试? – Jubobs

+4

我正在投票结束这个问题作为题外话,因为它可能是作业,并没有显示任何努力。 – Jubobs

回答

6

这是可以做到:

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

欲了解更多信息,read the documentation for Applicative functors,更具体地说,组成法律。实际上,任何Applicative实例composeApplicative f g <*> x必须总是等于f <*> (g <*> x)

作为一个小技术笔记,当进行等式推理时,等式的左侧和右侧必须用一个等号(=)分隔开。双等号(==)保留为decidable runtime equality checks

+0

“作为一个小技术笔记,在进行等式推理时,方程的左右两边必须用一个等号(=)分开,双等号(==)被保留用于可判定的运行时等式检查“。这不是共识规则;许多备受瞩目的Haskeller使用==来进行等式推理。 GHC文件甚至没有一贯地遵循它;见例如[Functor和Monad的文档](https://hackage.haskell.org/package/base-4.8.0.0/docs/Control-Monad.html#t:Functor)。 –

+0

@LuisCasillas:采取的要点。但我认为将平等区分为*命题*(其可能或可能不可判定)和*判决程序*(对于任意类型通常不存在)是有用的。 – pyon