我想學習Haskell中的函數組合。我有以下鍛鍊。
我有功能:h x y = f (g x y)
,我需要找到函數組合等於它:Haskell複雜函數組合
a) f . g
b) (f.).g
c) (.)f(.g)
d) f(.g)
我知道(.)f g = f.g = f(g x)
但我不理解這個複雜的函數組合
我想學習Haskell中的函數組合。我有以下鍛鍊。
我有功能:h x y = f (g x y)
,我需要找到函數組合等於它:Haskell複雜函數組合
a) f . g
b) (f.).g
c) (.)f(.g)
d) f(.g)
我知道(.)f g = f.g = f(g x)
但我不理解這個複雜的函數組合
正確的答案是(B ):(f.).g
讓我們來分析一下這個函數。該(f.)
部分是短期的((.) f)
,所以我們已經解決了一個,因此功能 - 無語法糖 - 是:
(.) ((.) f) g
現在我們可以重寫第一(.)
功能,一個lambda表達式:
\x -> ((.) f) (g x)
而現在,當我們在左邊(((.) f)
)計算第二個功能進一步,我們得到:
\x -> (.) f (g x)
或者:
\x -> f . g x
所以,如果我們轉換(.)
功能lambda表達式,我們得到:
\x -> (\y -> f ((g x) y))
現在我們可以讓這個表達更優雅。 (g x) y
可以改寫到g x y
:
\x -> (\y -> f (g x y))
,我們可以重寫嵌套lambda表達式到一個單一的lambda表達式:
\x y -> f (g x y)
這正是我們想要的。
您還可以使用(.) (.) (.)
- 儘管它是有點challenging to understand,評價結果在一個優雅的形式等同於你正在尋找的(.) (.) (.)
comp2 = (.) (.) (.)
comp2 f g x y == f (g x y)
評價一個
-- comp (.) = \f -> \g -> x -> f (g x) -- evaluate (.) (.) (.) (\f -> \g -> \x -> f (g x)) (.) (.) (\g -> \x -> (.) (g x)) (.) \x -> (.) ((.) x) \x -> (\f -> \g -> \x' -> f (g x')) ((.) x) \x -> \g -> \x' -> ((.) x) (g x') \x -> \g -> \x' -> ((\f -> \g' x'' -> f (g' x'')) x) (g x') \x -> \g -> \x' -> (\g' -> \x'' -> x (g' x'')) (g x') \x -> \g -> \x' -> \x'' -> x ((g x') x'') \x -> \g -> \x' -> \x'' -> x (g x' x'') -- alpha rename \f -> \g -> \x -> \y -> f (g x y) -- collapse lambdas \f g x y -> f (g x y)
瞭解(.)
組合物
-- comp2
comp2 = (.) (.) (.)
comp2 f g x y == f (g x y)
-- comp3
comp3 = (.) (.) comp2
comp3 f g x y z == f (g x y z)
-- comp4
comp4 = (.) (.) comp3
comp4 f g w x y z == f (g w x y z)
由於三個原因,我投下了一個贊成票:1.這個問題中顯示的知識水平不支持這種雙重組合的行爲對問題提問者立即顯而易見的假設,所以一開始就有一些解釋性句子是必要的。 2.這實際上並沒有將「結」與原始問題聯繫起來,所以最後需要一些解釋性句子來說明我們如何從這種形式的雙重組合開始,並以四種可能的選擇之一結束。我同意這是一個愚蠢的名字。所以不要傳播這個名字! –
@DanielWagner感謝您的徹底評論。我已經調整了一些答案,希望能夠提供更多信息。 – naomik
並向上投票。 =) –
邊注的一個模式:寫'F.G = F(G x)的'是有點馬虎。實際上,'f.g = \ x - > f(g x)'。 –