[英]Haskell: applying flip twice (type of flip flip)
我正在學習Haskell的一些基本功能。 我正在用Flip做一些練習,它接受兩個參數的函數並評估翻轉參數順序的結果。 考慮到翻轉功能,我認為,按照翻轉的定義,它會翻轉參數兩次,用原始順序中的參數評估原始函數。 當我用ghci檢查函數類型檢查這個假設時,它產生了:
翻轉翻轉:: b - >(a - > b - > c) - > a - > c
我不明白為什么這是翻蓋的功能類型。 它需要參數b和參數(a - > b - > c)並產生一個函數a - > c。 為什么會這樣? 我真的很感激解釋,因為我迷失了這個。 提前致謝
翻轉兩次將是\\f -> flip (flip f)
或flip . flip
flip . flip
。 這確實有類型(a -> b -> c) -> (a -> b -> c)
。
你在這里所做的不是在flip
函數上應用flip
,即翻轉flip
的參數順序。 所以,如果我們開始
flip :: (a -> b -> c) -> b -> a -> c
-- and, as the type of the argument
flip :: (a' -> b' -> c') -> b' -> a' -> c'
那么如果我們匹配類型
a = (a' -> b' -> c')
b = b'
c = a' -> c'
我們得到了結果
flip flip :: b' -> (a' -> b' -> c') -> (a' -> c')
我們來看看類型:
flip :: (a -> b -> c) -> b -> (a -> c)
flip :: (d -> e -> f ) -> e -> d -> f
flip flip :: b -> (a -> b -> c) -> (a -> c)
換句話說, flip
反轉其參數的前兩個參數,而flip
的前兩個參數是flip
的函數和該函數的第二個參數。 因此,不是按照'function','second argument','first argument'的順序接受參數,而是當你翻轉它時,順序變為'second argument','function','first argument'。
如果你想翻轉,然后翻轉,你會做這樣的事情:
doubleflip x = flip (flip x)
或等效地:
doubleflip = flip . flip
(.)
運算符將右側的輸出饋送到左側。
您不應用flip
功能兩次。 如果你想要flip
兩次,你正在尋找:
flip . flip :: (b -> a -> c) -> b -> a -> c
你在這里做的是翻轉 flip
功能。 所以它需要flip
才能flip
。
我們可以解決flip 1 flip 2
的類型(我這里使用下標來明確我們所指的flip
):
flip1 :: (a -> b -> c) -> b -> a -> c
flip2 :: (d -> e -> f) -> e -> d -> f
由於flip 2
是flip 1
的參數,因此這意味着flip 2
的類型與flip 1
的參數類型相同,因此這意味着:
a -> (b -> c )
~ (d -> e -> f) -> (e -> (d -> f))
因此,這意味着a ~ (d -> e -> f)
(類型a
與d -> e -> f
), b ~ e
和c ~ (d -> e)
。 所以函數flip 1 flip 2
的類型是flip 1
的輸出類型的類型,但是具有等價,所以這意味着:
flip1 flip2 :: b -> a -> c
flip1 flip2 :: e -> (d -> e -> f) -> (d -> e)
我們基本上創建了一個函數,首先獲取第二個參數,然后獲取函數,然后是第一個參數,然后使用翻轉的參數調用該函數。 因此,如果flip2 = flip flip
,它實現如下:
flip2 :: e -> (d -> e -> f) -> (d -> e)
flip2 y f x = f x y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.