Haskell Language
Monoide
Buscar..
Un ejemplar de monoide para listas.
instance Monoid [a] where
mempty = []
mappend = (++)
Comprobando las leyes de Monoid
para esta instancia:
mempty `mappend` x = x <-> [] ++ xs = xs -- prepending an empty list is a no-op
x `mappend` mempty = x <-> xs ++ [] = xs -- appending an empty list is a no-op
x `mappend` (y `mappend` z) = (x `mappend` y) `mappend` z
<->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs -- appending lists is associative
Contraer una lista de Monoids en un solo valor
mconcat :: [a] -> a
es otro método de la Monoid
clase de tipos :
ghci> mconcat [Sum 1, Sum 2, Sum 3]
Sum {getSum = 6}
ghci> mconcat ["concat", "enate"]
"concatenate"
Su definición por defecto es mconcat = foldr mappend mempty
.
Monoides Numéricos
Los números son monoidales de dos maneras: suma con 0 como unidad y multiplicación con 1 como unidad. Ambos son igualmente válidos y útiles en diferentes circunstancias. Entonces, en lugar de elegir una instancia preferida para los números, hay dos newtypes
, Sum
y Product
para etiquetarlos para la funcionalidad diferente.
newtype Sum n = Sum { getSum :: n }
instance Num n => Monoid (Sum n) where
mempty = Sum 0
Sum x `mappend` Sum y = Sum (x + y)
newtype Product n = Product { getProduct :: n }
instance Num n => Monoid (Product n) where
mempty = Product 1
Product x `mappend` Product y = Product (x * y)
Esto le permite al desarrollador elegir qué funcionalidad usar envolviendo el valor en el newtype
apropiado.
Sum 3 <> Sum 5 == Sum 8
Product 3 <> Product 5 == Product 15
Una instancia de monoide para ()
()
es un Monoid
. Dado que solo hay un valor de type ()
, solo hay una cosa que mempty
y mappend
podrían hacer:
instance Monoid () where
mempty = ()
() `mappend` () = ()
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow