[英]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
現在我們幾乎在那里。 在最終定義中,作者在各處交換了名稱x
和y
。 我不知道他們為什么選擇這么做,但這是您可以在方程式推理中做出的合法舉動,所以在那里沒有問題。 這樣做為我們提供了最終方程:
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 = fyx
和gyx = fxy
等效於alpha轉換 。 在這兩種情況下, f
在g
的定義中都是自由變量; g
是f
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.