簡體   English   中英

Haskell中翻轉function的定義

[英]Definition of the flip function in Haskell

目前我正在嘗試通過“Learn You a Haskell”一書來學習 Haskell,並且我正在嘗試了解第 5 章flip function 的實現。 問題是作者聲明如果gxy = fyx有效,那么fyx = gxy也必須為真。 但是這種反轉如何以及為什么會影響兩個 function 定義?

我知道柯里化是如何工作的,而且我也知道->運算符默認是右關聯的,因此類型聲明實際上是相同的。 我也了解彼此分開的功能,但不了解gxy = fyx的反轉與此有何關系。

第一次翻轉 function

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
    where g x y = f y x

第二次翻轉 function

flip' :: (a -> b -> c) -> b -> a -> c
flip' f y x = f x y

我認為作者腦海中的論點被粗略地縮寫為一點都不合理。 但是這是我對推理的猜測。 我們從第一個定義開始:

flip f = g where g x y = f y x

現在我們觀察到這是一個可咖喱的東西,並且我們使用(->)和垃圾的所有關聯性討論來寫相同的東西,但是對f附加了兩個參數。 像這樣:

flip f x y = g x y where g x y = f y x

現在我們得到了他雙向調用的方程: gxy = fyx ,反之亦然。 我們可以使用以下公式重寫flip的主體,如下所示:

flip f x y = f y x where g x y = f y x

由於定義的主體不再提及g ,因此我們可以將其刪除。

flip f x y = f y x

現在我們幾乎在那里。 在最終定義中,作者在各處交換了名稱xy 我不知道他們為什么選擇這么做,但這是您可以在方程式推理中做出的合法舉動,所以在那里沒有問題。 這樣做為我們提供了最終方程:

flip f y x = f x y

flip接受一個函數並返回該函數的翻轉版本。 定義“ flip'一種方法是將應用程序包含在定義本身中,因為

flip' f y x = f x y  ===> flip' f y = \x -> f x y
                     ===> flip' f = \y -> \x -> f x y

也就是說, flip' f是函數,它以相反的順序將f應用於自己的參數。

第二個定義只是簡單地給匿名函數\\y -> \\x -> fxy一個名稱,然后使用該名稱作為flip' fxy的定義。

                     ===> flip' f = g where g = \y -> \x -> f x y
                     ===> flip' f = g where g y = \x -> f x y
                     ===> flip' f = g where g y x = f x y

即, flip' f是一些功能g ,其中g被定義為應用f到的參數g以相反的順序。

定義gxy = fyxgyx = fxy等效於alpha轉換 在這兩種情況下, fg的定義中都是自由變量; gf flip'f參數的閉包。

如果您在這里尋找翻轉的作用:

Prelude> pow x y = x ^ y
Prelude> pow 2 3
8
Prelude> flip pow 2 3
9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM