![](/img/trans.png)
[英]How does function application with the $ operator curry in Haskell?
[英]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
x
和y
必須具有Eq
實例的類型,但它們不需要是Eq
的相同實例。 例如,如果我們有12
和"abc"
怎么辦? 這是兩種不同的類型,但我們仍然可以使用我們的函數,因為它們都是Eq
實例: (\\xyz -> (x, y) == z) (12, "abc") (30, "cd")
(此表達式類型檢查並計算為False
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.