簡體   English   中英

咖喱(==)如何運作?

[英]How does curry (==) work?

我明白那個:

(==):: Eq a => a - > a - > Bool

應用程序的示例可以是(==)2 2,結果為True。

然后:

uncurry(==):: Eq b =>(b,b) - > Bool。

應用程序的示例可能是uncurry(==)(2,2),結果為True。

但我不明白並想象一個例子為什么:

咖喱(==)::(Eq a,Eq b)=> a - > b - >(a,b) - > Bool

有幫助嗎?

謝謝,
塞巴斯蒂安

==可以在元組上使用,也就是你可以寫(a1, b1) == (a2, b2)

在這種情況下, ==的類型專門用於(Eq a, Eq b) => (a, b) -> (a,b) -> Bool

如果您現在將curry應用於該類型,則得到(Eq a, Eq b) => a -> b -> (a, b) -> Bool

curry的定義是:

curry :: ((a, b) -> c) -> a -> b -> c
curry f = \x y -> f (x, y)

如果我們用以下代替:

\x y z -> (curry (==) x y) z
\x y z -> ((==) (x, y)) z    -- Function application
\x y z -> (==) (x, y) z      -- Remove parentheses (function application is left associative in Haskell, so they are unnecessary here)
\x y z -> (x, y) == z        -- Convert to infix

我們可以立刻知道z必須是某種元組,否則最后一行不會進行類型檢查,因為==兩個參數必須具有相同的類型。

當我們查看Eq的元組實例的定義時,我們發現

instance (Eq a, Eq b) => Eq (a, b) where
  (x, y) == (x', y') = (x == x') && (y == y')

(這不是在標准庫的源代碼中拼寫出來的,它實際上使用“獨立派生”機制來自動派生(Eq a, Eq b) => (a, b)類型的實例。相當於得到的東西。)

所以,在這種情況下,我們可以將==視為具有類型

(==) :: (Eq a, Eq b) => (a, b) -> (a, b) -> Bool

xy必須具有Eq實例的類型,但它們不需要是Eq相同實例。 例如,如果我們有12"abc"怎么辦? 這是兩種不同的類型,但我們仍然可以使用我們的函數,因為它們都是Eq實例: (\\xyz -> (x, y) == z) (12, "abc") (30, "cd") (此表達式類型檢查並計算為False )。

暫無
暫無

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

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