2013-07-01 33 views
7

Nó chỉ xuất hiện với tôi rằng không có cách nào để tiêm một giá trị duy nhất vào một Monoid trong Data.Monoid. Tôi ngần ngại sử dụng Data.Monad.return cho điều này nhưng đã hy vọng tìm thấy một cái gì đó như singleton cho một số loại.Làm thế nào để tiêm một giá trị vào một Monoid?

+5

Một 'Monoid' chỉ là một kiểu với một cá thể 'Monoid', nó không phải là một vùng chứa (nói chung) mà bạn đưa vào các giá trị. Ví dụ có một 'instance Monoid Ordering', và cho rằng bạn có ba giá trị (không dưới)' LT', 'EQ',' GT', không có gì để tiêm, chỉ cần viết giá trị. –

+2

Loại nào? 'singleton :: Monoid m => a -> ???' –

+0

@AlexeyRomanov 'singleton x = mempty' :) (rất hữu ích) –

Trả lời

15

Lớp Monoid không cho phép bất kỳ loại tiêm nào vì monoid không phải là bất kỳ loại container nào. Một số container là monoids, và sau đó chúng sẽ có phương tiện tiêm riêng. Đối với lần tiêm tương đối tổng quát, bạn có thể sử dụng pure từ Applicative hoặc return từ Monad (trước đây là tổng quát hơn).

+0

Hmm ... vậy ... là có một lớp căn cứ lý thuyết kết thúc tốt đẹp' Container '? – fho

+12

@ Florian: nhập các hàm tạo có hoạt động "inject" này, nhưng không nhất thiết là 'Applicative', được gọi là [' Pointed'] (http://hackage.haskell.org/packages/archive/pointed/3.0.3/doc/ html/Data-Pointed.html). – leftaroundabout

6

Thêm vào những gì người khác đã nói: Int tạo thành một monoid (theo nhiều cách khác nhau). Làm thế nào bạn sẽ "tiêm" một giá trị vào Int? Vâng, bạn không; an Int chỉ là Int. Bạn có thể có thể sử dụng số không hoặc một cái gì đó ...?

Bây giờ, nếu một cái gì đó một thùng chứa, nó tạo thành một hình đơn. Nhưng bit monoid không giúp bạn xử lý nó như một container; bạn cần phải thử cái gì khác cho điều đó. Rất nhiều thứ không phải là các thùng chứa hình thành monoids.

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