Những gì tôi đang cố gắng làm là tầm thường để xác định bằng tay, về cơ bảnLàm thế nào để sử dụng các giá trị monoid và kết hợp với thao tác tùy chỉnh, dễ dàng?
maybeCombine :: (a->a->a) -> Maybe a -> Maybe a -> Maybe a
maybeCombine _ Nothing Nothing = Nothing
maybeCombine _ (Just a) Nothing = Just a
maybeCombine _ Nothing (Just a) = Just a
maybeCombine f (Just a) (Just a') = Just $ f a a'
Nó không phải là một vấn đề lớn để define this locally when needed, nhưng vẫn cumbersone và đang được rất cơ bản và tổng quát có vẻ như cần có một thực hiện tiêu chuẩn, nhưng tôi dường như không thể tìm thấy một.
Có lẽ tôi chỉ đang xem cái gì đó. Những gì tôi muốn có vẻ khá không liên quan đến hành vi của các đơn nguyên có lẽ, vì vậy tôi nghĩ rằng tôi sẽ không tìm thấy bất cứ điều gì trong ngăn kéo Monad/Arrow; nhưng nó chắc chắn tương tự như Monoid
dụ
Prelude Data.Monoid> Chỉ cần "a" <> Không có gì
Chỉ cần "a"
Prelude Data.Monoid> Chỉ cần "a" <> Chỉ cần "b"
chỉ cần "ab"
...
... mà tuy nhiên đòi hỏi a
là một monoid chính nó, nghĩa là nó về cơ bản có a->a->a
"được xây dựng trong". Các ví dụ MonadPlus
cũng cư xử giống như tôi muốn, nhưng nó chỉ đơn giản là ném đi một trong những giá trị chứ không phải là cho phép tôi để cung cấp một chức năng kết hợp
Prelude Data.Monoid Control.Monad> Chỉ cần 4 'mplus` Không có gì
chỉ cần 4
Prelude Data.Monoid Control.Monad> Không có gì 'mplus` chỉ 4
chỉ 4
Prelude Data.Monoid Control.Monad> chỉ cần 4' mplus` chỉ 5
chỉ 4
Giải pháp kinh điển là gì? Kết hợp mẫu địa phương? Một cái gì đó với combinators từ ví dụ: Data.Maybe
? Xác định một monoid tùy chỉnh để làm việc kết hợp?
Tôi không gặp may, trong vấn đề này tôi đang làm việc ngay bây giờ tôi có thể thực sự sử dụng semigroup 'Max' và nhận được một giải pháp thực sự tốt đẹp! – leftaroundabout
Tuyệt vời! Tôi thường kết thúc việc xác định 'Option (Max a)' như tiếp giáp với "infinity âm" trên một loại, vì vậy tuyệt đối. Tôi nghĩ đó là một "Monoid" thực sự tao nhã. –