Định nghĩa của curry
là:
curry :: ((a, b) -> c) -> a -> b -> c
curry f = \x y -> f (x, y)
Nếu chúng ta thay thế mà trong:
\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
Chúng tôi có thể nói ngay rằng z
phải có một số loại của tuple là tốt, hoặc người nào khác dòng cuối cùng này sẽ không đánh dấu kiểm tra vì cả hai đối số của ==
phải có cùng loại.
Khi chúng ta nhìn vào định nghĩa của dụ tuple cho Eq
, chúng tôi tìm
instance (Eq a, Eq b) => Eq (a, b) where
(x, y) == (x', y') = (x == x') && (y == y')
(Đây không phải là nêu ra trong mã nguồn của thư viện chuẩn, nó thực sự sử dụng "bắt nguồn độc lập" cơ chế để tự động lấy được các ví dụ cho kiểu (Eq a, Eq b) => (a, b)
. mã này tương đương với những gì được bắt nguồn mặc dù.)
vì vậy, trong trường hợp này, chúng ta có thể đối xử với ==
như thể nó có kiểu
(==) :: (Eq a, Eq b) => (a, b) -> (a, b) -> Bool
Cả x
và y
phải có loại đó là trường hợp của Eq
, nhưng họ không cần phải là trường hợp cùng của Eq
. Ví dụ: nếu chúng tôi có 12
và "abc"
thì sao? Đó là hai loại khác nhau nhưng chúng tôi vẫn có thể sử dụng chức năng của chúng tôi vì cả hai trường hợp là Eq
: (\x y z -> (x, y) == z) (12, "abc") (30, "cd")
(loại biểu thức này kiểm tra và đánh giá là False
).
Ok, nhưng làm thế nào bạn nhận ra rằng == đã được áp dụng cho bộ dữ liệu? – Fof
@Seba Vì 'curry' mong đợi một hàm có đối số đầu tiên là một bộ tuple. – sepp2k