2014-10-27 2 views
4

Конечно, тип данных не является точным, но так ли это (более или менее) реализован Monoid Bool?Monoid Bool in Haskell

import Data.Monoid 

data Bool' = T | F deriving (Show) 

instance Monoid (Bool') where 
    mempty = T 
    mappend T _ = T 
    mappend _ T = T 
    mappend _ _ = F 

Если да/нет, то рассуждения для изготовления Bool «s mappendOR против AND?

ответ

13

Есть два возможных Monoid экземпляров для Bool, так Data.Monoid имеет Newtypes отличить которую мы намерены:

-- | Boolean monoid under conjunction. 
newtype All = All { getAll :: Bool } 
     deriving (Eq, Ord, Read, Show, Bounded, Generic) 

instance Monoid All where 
     mempty = All True 
     All x `mappend` All y = All (x && y) 

-- | Boolean monoid under disjunction. 
newtype Any = Any { getAny :: Bool } 
     deriving (Eq, Ord, Read, Show, Bounded, Generic) 

instance Monoid Any where 
     mempty = Any False 
     Any x `mappend` Any y = Any (x || y) 

Edit: Есть на самом деле четыре действительных экземпляров, как Ørjan отмечает

+1

спасибо. Я не уверен, что это отдельный вопрос, но почему используется 'newtype', а не' data'? Thx –

+1

'newtype' более эффективен, чем' data'. Обтекание и разворачивание нового стиля бесплатное. –

+11

На самом деле четыре. '(&&), (||), (==), (/ =)' все являются возможными моноидными операциями. Тем не менее, последние два не предопределены. –

3

Вашего условие экземпляра ISN это моноид.

mappend F mempty 
mappend F T -- by definition of mempty 
T   -- by definition of mappend 

поэтому мы доказали F <> mempty === T, но и для любого моноиде, x <> mempty === x.

Устройство для Any - False, а устройство для All - True.

Смежные вопросы