2014-04-22 15 views
6

Tôi hiểu rằng:Cà ri (==) hoạt động như thế nào?

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

Một ví dụ về ứng dụng có thể được (==) 2 2, mà kết quả là đúng.

và rằng:

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

Ví dụ về đơn đăng ký có thể không rõ ràng (==) (2, 2), kết quả là True.

Nhưng tôi không hiểu và hình dung một ví dụ tại sao:

cà ri (==) :: (Eq một, Eq b) => a -> b -> (a, b) - > Bool

Bất kỳ trợ giúp nào?

Cảm ơn,
Sebastián

Trả lời

8

Đị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ả xy 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"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).

9

== có thể được sử dụng trên bộ dữ liệu, bạn có thể viết (a1, b1) == (a2, b2).

Trong trường hợp đó, loại == chuyên để (Eq a, Eq b) => (a, b) -> (a,b) -> Bool.

Nếu bây giờ bạn áp dụng curry cho loại đó, bạn sẽ nhận được (Eq a, Eq b) => a -> b -> (a, b) -> Bool.

+0

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

+4

@Seba Vì 'curry' mong đợi một hàm có đối số đầu tiên là một bộ tuple. – sepp2k

Các vấn đề liên quan