2013-06-10 19 views
10

According to the Haskell wikibook, một Monad gọi m là một Functor với hai hoạt động bổ sung:Nó không phải là một đơn nguyên, nhưng nó là gì?

unit :: a -> m a 
join :: m (m a) -> m a 

Đó là tốt đẹp, nhưng tôi có một cái gì đó hơi khác nhau. Lướt qua các chi tiết đẫm máu, tôi có một loại có các hàm unitjoin tốt, nhưng fmap không hoạt động tốt (fmap g . fmap f không nhất thiết phải là fmap (g.f)). Bởi vì điều này, nó không thể được thực hiện một thể hiện của Monad. Tuy nhiên, tôi muốn cung cấp cho nó nhiều chức năng chung nhất có thể.

Vì vậy, câu hỏi của tôi là, cấu trúc lý thuyết danh mục nào tương tự như monads ở chỗ chúng có unitjoin?

Tôi nhận thấy rằng ở một mức độ nào đó, câu hỏi trên không được xác định rõ ràng. Đối với monads, các định nghĩa unitjoin chỉ có ý nghĩa về định nghĩa fmap. Nếu không có fmap, bạn không thể xác định bất kỳ luật đơn nguyên nào, do đó, bất kỳ định nghĩa nào của unit/join sẽ không có giá trị "hợp lệ". Vì vậy, tôi đang tìm các chức năng khác ngoài fmap rằng có thể có ý nghĩa để xác định một số luật "không đơn điệu" trên các hàm unitjoin này.

+5

bạn có thể miêu tả thêm về cấu trúc mà bạn có, và những gì trong những nguyên nhân đặc biệt nó thất bại của pháp luật về hợp nhất cho 'fmap'? – luqui

+2

Tôi cho rằng bạn đã "tinh chỉnh" 'fmap' theo cách để' join' hoàn thành luật thứ hai? Thông thường, bạn hầu như luôn nhận được 'fmap g. fmap f ≡ fmap $ f.g' chỉ tự động. – leftaroundabout

+0

@luqui Tôi quan tâm đến tổng quát hơn là trường hợp cụ thể này, nhưng đó là phân phối bình thường. Nếu bạn nghĩ về 'fmap' khi áp dụng một hàm cho mọi điểm trong một phân phối, thì' fmap' chỉ tuân theo luật 'Functor' để bổ sung và nhân. 'đơn vị' được đào tạo trên một điểm dữ liệu duy nhất, và' nối' là kết hợp một "phân phối bình thường của các bản phân phối bình thường" thành một phân bố chuẩn duy nhất. Rõ ràng, điều này đòi hỏi một số ràng buộc về các tham số, do đó, nó không thể được thực hiện ở tất cả bằng cách sử dụng các lớp 'Base' loại và tôi đang sử dụng' ConstraintKinds' để chơi xung quanh với nó. –

Trả lời

3

Vâng, đây là một luật bạn nên có chỉ với unitjoin. Với x :: m a,

join (unit x) = x 

Để chứng minh rằng điều này không chỉ đến từ hư không, chúng ta hãy bắt đầu với một luật đơn nguyên hiện có:

return x >>= f = f x 

Cho rằng m >>= f = join (fmap f m)

join (fmap f (return x)) = f x 

Chọn f = id

join (fmap id (return x)) = id x 

Sử dụng các luật functor rằng fmap id = id

join (id (return x)) = id x 

Sử dụng rõ ràng id a = a

join (return x) = x