2012-01-24 40 views
6

Có cách nào tốt hơn để thể hiện (\(a, b) -> a < b) với thành phần chức năng không? Tôi cảm thấy như tôi đang thiếu một cái gì đó và thử nghiệm với curry chỉ làm tôi bối rối hơn.Tuple và thành phần chức năng

Trả lời

12

curry là điều sai để sử dụng tại đây; nó biến một hàm hoạt động trên tuples thành một hàm curried. Bạn muốn đối diện, là uncurry:

uncurry :: (a -> b -> c) -> (a, b) -> c 

Trong trường hợp này, nó là uncurry (<).

(Một nguồn hữu ích cho combinators hữu ích trong các chức năng bằng văn bản về các tuple là Control.Arrow; từ (->) là một thể hiện của Arrow, bạn có thể đọc a b c như b -> c.)

1

Nhìn vào các loại là cách tốt nhất trong Haskell để được ý tưởng đầu tiên, những gì bất kỳ chức năng thực hiện:

curry :: ((a, b) -> c) -> a -> b -> c 
uncurry :: (a -> b -> c) -> (a, b) -> c 

curry: chức năng của cặp → chức năng cà ri (nó curries một chức năng).

uncurry: chức năng curried → chức năng của cặp.

Haskell Wiki page on currying có bài tập nhỏ ở cuối trang:

  • Đơn giản hóa curry id
  • Đơn giản hóa uncurry const
  • nhanh snd sử dụng curry hoặc uncurry và chức năng Prelude cơ bản khác và không có lambdas
  • Viết hàm \(x,y) -> (y,x) không có lambda và wi Chỉ các chức năng Prelude

Cố gắng giải quyết các bài tập này ngay bây giờ, chúng sẽ cung cấp cho bạn một cái nhìn sâu sắc về hệ thống kiểu Haskell và ứng dụng chức năng.

Có rất nhiều ứng dụng thú vị của uncurry, hãy cố gắng vượt qua đối số khác nhau để các chức năng dưới đây và xem những gì họ làm:

uncurry (.) :: (b -> c, a -> b) -> a -> c 
uncurry (flip .) :: (b -> a -> b1 -> c, b) -> b1 -> a -> c 
uncurry (flip (.)) :: (a -> b, b -> c) -> a -> c 
uncurry ($) :: (b -> c, b) -> c 
uncurry (flip ($)) :: (a, a -> c) -> c 

-- uncurry (,) is an identity function for pairs 
uncurry (,) :: (a, b) -> (a, b) 
uncurry (,) (1,2) -- returns (1,2) 
uncurry uncurry :: (a -> b -> c, (a, b)) -> c 
uncurry uncurry ((+), (2, 3)) -- returns 5 

-- curry . uncurry and uncurry . curry are identity functions 
curry . uncurry :: (a -> b -> c) -> (a -> b -> c) 
(curry . uncurry) (+) 2 3 -- returns 5 
uncurry . curry :: ((a, b) -> c) -> ((a, b) -> c) 
(uncurry . curry) fst (2,3) -- returns 2 

-- pair -> triple 
uncurry (,,) :: (a, b) -> c -> (a, b, c) 
uncurry (,,) (1,2) 3 -- returns (1,2,3) 
Các vấn đề liên quan