2013-12-23 147 views
0
flip' :: (a -> b -> c) -> (b -> a -> c) 
flip' f = g 
    where g x y = f y x 

我想問的是,在上述翻轉「功能,似乎炫」將返回一個函數命名爲G和GXY份額FYX相同的值哈斯克爾翻蓋模擬問題

然而,在「裏gxy = fyx「,fyx是一個函數調用並返回一個值,gxy將返回一個值,所以」v2 = v1「是否合理?

我知道代碼可以工作,但我想知道更多關於它如何實現的情況。

有沒有人有想法?非常感謝你

+0

如果「其中g x y = f y x」表示g的函數定義,那麼爲什麼下面的代碼有效? flip'::(a - > b - > c) - > b - > a - > c flip'fyx = fxy因爲「fxy」是一個值,但返回類型應該是函數 – user3129535

+1

我不明白爲什麼任何人都會這樣定義它,而不是'翻轉'f = \ xy - > fyx'(如果你想超級清晰)。 – augustss

回答

4

where g x y = f y xg x y不是一個函數調用g與參數xy。它是函數g作爲函數的聲明,其中取2個參數xy,並對f y x進行評估。

所以這意味着flip'給定一個函數f取2個參數將評估爲gg本身被定義爲交換兩個參數來呼叫f

+0

謝謝你的幫助。但這個代碼如何翻轉'::(a - > b - > c) - > b - > a - > c flip'fyx = fxy因爲「fxy」是一個值,但返回類型應該是函數 – user3129535

+1

@ user3129535你不應該把'='看作是一個賦值。這是一個定義。 'flip f y x = f x y'就像是:命令式語言中的「def flip(f,y,x):return f(x,y)'。 '='的右側是一個表達式,而左側是函數的「flip」參數的*聲明*。 – Bakuriu

+0

@ user3129535不是一回事。在這種情況下,'flip'::(a→b→c)→b→a→c'取一個函數'(a - > b - > c)'和一個值'b', 'a'返回值'c'。在你的問題中,你正在談論一個函數採用函數'(a - > b - > c)'並返回一個函數'(b - > a - > c)'。 – Johan