2012-09-09 23 views
37

Tôi tò mò về biểu thức flip id (Không phải bài tập về nhà: Tôi đã tìm thấy nó trong tài liệu getOpt).Tại sao "lật id" của Haskell có loại này?

Tôi tự hỏi tại sao nó lại có kiểu này:

Prelude> :t (flip id) 
(flip id) :: b -> (b -> c) -> c 

Ví dụ, (flip id) 5 (+6) cho 11.

Tôi biết tại sao id (+6) 5 cho 11, nhưng tôi không "nhận" điều flip id.

Tôi đã cố gắng tìm ra điều này bằng chính bút và giấy nhưng không thể. Ai có thể vui lòng giải thích điều này với tôi? Ý tôi là, làm thế nào để flip id có loại b -> (b -> c) -> c?

Trả lời

66

Các id chức năng có loại này:

id :: a -> a 

Bạn nhận được một thể hiện của loại hình này, khi bạn thay thế a bởi a -> b:

id :: (a -> b) -> (a -> b) 

đó, vì tách lạng bộ, cũng giống như :

id :: (a -> b) -> a -> b 

Bây giờ, hãy áp dụng flip này và bạn sẽ có được:

flip id :: a -> (a -> b) -> b 

Trong trường hợp của id (+) dụ là:

id :: (Num a) => (a -> a) -> (a -> a) 

Bây giờ flip id mang đến cho bạn:

flip id :: (Num a) => a -> (a -> a) -> a 

Side lưu ý: Điều này cũng cho bạn thấy thế nào ($) giống với id, chỉ với loại bị hạn chế hơn:

($) :: (a -> b) -> a -> b 
($) f x = f x 
-- unpoint: 
($) f = f 
-- hence: 
($)  = id 
+11

Hey, ertes, bạn dường như có [một tài khoản khác] (http://stackoverflow.com/users/1488832/ertes), cả hai đều chưa được đăng ký. Nếu bạn đăng ký tài khoản của mình, bạn có thể [hợp nhất chúng] (http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregist) và sau đó có một tài khoản duy nhất cho tất cả các câu trả lời của bạn (mà thực sự là tốt, bằng cách này!). – huon

+0

Cảm ơn, câu trả lời tuyệt vời. Việc bạn đề cập đến '$' làm cho nó trực quan hơn để hiểu và tôi vui vì bạn đã không bỏ nó ra. Nó sẽ mất bộ não của tôi một vài ngày nữa để hiểu đầy đủ câu trả lời của bạn. –

+3

Câu trả lời hay. Suy nghĩ về 'lật id' là' flip ($) 'giúp rất nhiều. – Garrett

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