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
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
.)
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ụngcurry
hoặcuncurry
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 PreludeCố 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)
- 1. Thành phần chức năng
- 2. runST và chức năng thành phần
- 3. Áp dụng một tuple chức năng đến một giá trị và trả về một tuple
- 4. Quy tắc viết lại Haskell và thành phần chức năng
- 5. Folding, thành phần chức năng, monads, và laziness, oh my?
- 6. Haskell: suy luận kiểu và chức năng thành phần
- 7. độ lười và thành phần chức năng (haskell, erlang)
- 8. Chức năng Thành phần trong R (và chức năng mức cao)
- 9. Haskell chức năng thành phần câu hỏi
- 10. Loại trả về Scala cho các chức năng tuple
- 11. Haskell: Sử dụng bản đồ trong thành phần chức năng
- 12. nếp gấp. thành phần chức năng foldr - Haskell
- 13. Thành phần chức năng tốt hơn trong Python
- 14. Tôi có sử dụng đúng thành phần chức năng không?
- 15. scala loại tuple phần
- 16. Các phần chức năng và không chức năng của ứng dụng là gì?
- 17. Loại lỗi với cấp bậc-2 chủng loại và chức năng thành phần
- 18. chức năng thành viên ẩn chức năng miễn phí
- 19. Python chuyển đổi Tuple thành Số nguyên
- 20. Chức năng thành viên tĩnh
- 21. Chức năng thành viên tĩnh và an toàn luồng
- 22. Con trỏ chức năng thành viên và thừa kế
- 23. Lỗi thành công và lỗi chức năng Ajax
- 24. Các chức năng thành viên tĩnh và an toàn luồng
- 25. Move thế hệ chức năng thành viên
- 26. Làm thế nào để viết một wrapper trên chức năng và chức năng thành viên thực thi một số mã trước và sau khi các chức năng bọc?
- 27. Chức năng phần trăm trong CRAN -R
- 28. Chuyển tuple thành danh sách và quay lại
- 29. make_shared và chức năng emplace
- 30. Chức năng gọi thành viên của số