Một mẫu chung có liên quan đến Functor và các trường hợp ứng dụng của hàm là ví dụ (+) <$> (*2) <*> (subtract 1)
. Điều này đặc biệt hữu ích khi bạn phải nạp một chuỗi hàm với một giá trị duy nhất. Trong trường hợp này, giá trị trên tương đương với \x -> (x * 2) + (x - 1)
. Trong khi điều này rất gần với LiftA2
, bạn có thể mở rộng mẫu này vô thời hạn. Nếu bạn có hàm f để lấy 5 tham số như a -> a -> a -> a -> a -> b
bạn có thể làm như f <$> (+2) <*> (*2) <*> (+1) <*> (subtract 3) <*> (/2)
và nạp nó với một giá trị duy nhất. Cũng giống như trong trường hợp dưới đây;
Prelude> (,,,,) <$> (+2) <*> (*2) <*> (+1) <*> (subtract 3) <*> (/2) $ 10
(12.0,20.0,11.0,7.0,5.0)
Edit: tín dụng cho một tái comment của @ Will Ness cho một lời nhận xét của tôi dưới một chủ đề khác, ở đây có một cách sử dụng tuyệt đẹp của applicative qua chức năng;
Prelude> let isAscending = and . (zipWith (<=) <*> drop 1)
Prelude> isAscending [1,2,3,4]
True
Prelude> isAscending [1,2,5,4]
False
[Trình đơn đọc] (http://hackage.haskell.org/package/mtl/docs/Control-Monad-Reader.html) về cơ bản chỉ là trình bao bọc newtype xung quanh '(->)'. – melpomene
Tôi sử dụng chúng mọi lúc. Có lẽ bạn tự làm điều đó mà không biết: '.' chỉ là' fmap'. – Bergi
@Bergi: chắc chắn, tôi đoán câu hỏi là tại sao nên sử dụng chúng thay vì chỉ sử dụng (.) –