當我不掌握Haskell中的表達式如何工作時,我經常發現它有助於將它分解爲更基本的形式。應用性重寫(Haskell)
使用下列定義
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
我改寫sequenceA [(+3),(+2)] 3
作爲
(\_ -> (:)) <*> (+3) <*> ((\_ -> (:)) <*> (+2) <*> (\_-> [])) $ 3
然後把它變成(請原諒的格式,我不知道該約定是什麼分割線)
(\d ->(\c->(\b -> (\a -> (\_ -> (:)) a (+3) a) b (\_ -> (:)) b) c (+2) c) d (\_ -> []) d) 3
這似乎是正確的,但我無法讓GHCi接受它。我在這裏做錯了什麼?我的第二個問題是如何從這種形式轉換爲功能組合。我已經試過各種組合substituing點,但GHCI拒絕所有的人....
您的方法論已經過去了,但這絕對是我第一個問題的答案。有關第二個的任何想法? (翻譯成(。)符號) – planarian 2012-08-10 18:59:56
我的方法是通過生成相關表達式作爲字符串來機械化「寫出擴展」的過程。在「純」計算常量函數的地方,「pu」計算常量函數的*文本*。與此同時,我對翻譯的主要思考是不斷地發揮作用,因爲這樣做不會特別有啓發性。讓我們通過組合來表達'<*>',並且...因爲第三個(*環境*)參數被複制,所以這是一個麻煩。我們需要一個複印機,例如'加入f a = f a a',然後'(<*>)=(join。)。 ((。)。翻轉)'這不是很亮。 – pigworker 2012-08-10 19:27:08
如果你認爲我自己想到了這一點,我最好指出一下關於組合邏輯的方便頁面:http://en.wikipedia.org/wiki/B,C,K,W_System'Applicative'實例對於'(( - >)a)'作爲K combinator,''純''作爲S combinator'<*>'。將應用式表達式轉換成合成量可將SK-組合器術語轉換爲BCKW-組合術語,這是可行的(兩個系統都是完整的)但又髒兮兮的。 – pigworker 2012-08-10 19:31:22