2015-07-12 66 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