2013-03-27 26 views
6

Monads xác định Semigroups quatrường hợp chồng chéo bằng cách chuyển Monads vào nửa nhóm

instance Monad m => Semigroup (m a) where 
    (<>) = (>>) 

sử dụng FlexibleInstances.

Nếu tôi muốn làm Maybe a thành một Semigroup theo cách mà tôi sẽ chạy vào sự chồng chéo intance, vì Data.Semigroup định nghĩa một

instance Semigroup a => Semigroup (Maybe a) 

các Haskell-Way để giải quyết một cái gì đó như thế là gì?

Trả lời

11

Cách phổ biến trong đó các vấn đề này được giải quyết là với trình bao bọc newtype. Bạn sẽ không xác định một số instance Semigroup (m a), mà là

newtype WrappedMonad m a = WrappedMonad { getWrappedMonad :: m a } 

instance Monad m => Semigroup (WrappedMonad m a) where 
    WrappedMonad a <> WrappedMonad b = WrappedMonad (a >> b) 
+0

Cảm ơn! Điều đó hoạt động như một sự quyến rũ. Tôi chỉ ước có một cách để che giấu các trường hợp .. –

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