2011-08-26 31 views
28

Tôi đang xem lớp học Applicative trong thư viện Haskell và tình cờ gặp Alternative.Haskell - Điều gì là Control.Applicative.Alternative tốt cho?

Lớp học này tốt cho điều gì? Tìm kiếm trên google không tiết lộ bất kỳ điều gì đặc biệt sâu sắc. Và nó dường như hoàn toàn không đúng chỗ, được đóng gói giống như với gói Ứng dụng.

Ai đó có thể vui lòng đăng một kịch bản có thể xảy ra khi bạn sử dụng lớp học này?

Trả lời

22

Nó thường được sử dụng với bộ phối hợp trình phân tích cú pháp. Ví dụ: nếu space là trình kết hợp phân tích cú pháp khớp với một ký tự khoảng trống duy nhất, many space sẽ là một ký tự khớp với khoảng trắng liên tiếp.

Tôi có thể đồng ý rằng nó hơi không đúng chỗ trong Control.Applicative.

+18

Chỉ * hơi * ra khỏi nơi - đó là một monoid trên 'Applicative's, trong mô hình giống như 'MonadPlus' và' ArrowPlus', cả hai trong đó cũng chia sẻ một mô-đun với lớp họ đang dựa vào. Để nhất quán, "nên" đã được gọi là "ApplicativePlus" nhưng đó là một cái tên xấu xí. –

+0

Được rồi giải thích rất nhiều! Mặc dù đặt tên 'ApplicativePlus' thành' Alternative' không phải là một điều tốt vì nó có ý nghĩa giới hạn phạm vi của nó. –

+0

@C. A. McCann, tôi ước bạn sẽ chuyển lời nhận xét của bạn thành một câu trả lời để tôi có thể chấp nhận nó :) –

16

Đôi khi các nhà điều hành <|> là khá hữu ích:

foldl1 (<|>) [Nothing, Just 5, Just 3] 
-- Just 5 
+1

Ah đó là thú vị! Trong bối cảnh đó <|> giống như mạch ngắn || toán tử bằng nhiều ngôn ngữ bắt buộc .. –

+3

Bạn cũng có thể thực hiện điều này bằng cách sử dụng 'mconcat' với [monoid đầu tiên] (http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid. html # t: Đầu tiên). Điều này tổng quát hóa thành [những thứ khác có thể là "Monoids"] (http://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/). – hammar

+5

Ồ, không, 'foldl1' được sử dụng ở đâu đó có một mặc định hợp lý (' foldl (<|>) Nothing'). Bạn sẽ làm gì khi câu trả lời của bạn bị treo? : D – Rotsor

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