簡體   English   中英

Haskell:應用翻轉兩次(翻轉翻轉類型)

[英]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 2flip 1的參數,因此這意味着flip 2的類型與flip 1的參數類型相同,因此這意味着:

        a       -> (b ->    c    )
~ (d -> e -> f) -> (e -> (d -> f))

因此,這意味着a ~ (d -> e -> f) (類型ad -> e -> f ), b ~ ec ~ (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.

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