you monad learn haskell monads

monad - ¿Se aplican las leyes de la mónada en Haskell?



list monad (2)

No, las leyes de la mónada no se aplican por el idioma. Pero si no se adhiere a ellos, es posible que su código no se comporte necesariamente como esperaría en algunas situaciones. Y ciertamente sería confuso para los usuarios de su código.

De la wiki de Haskell:

Las mónadas pueden verse como una interfaz de programación estándar para varios datos o estructuras de control, que es capturada por la clase Monada. Todas las mónadas comunes son miembros de ella:

class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a

Además de implementar las funciones de clase, todas las instancias de Monad deben obedecer las siguientes ecuaciones o Leyes de Monad:

return a >>= k = k a m >>= return = m m >>= (/x -> k x >>= h) = (m >>= k) >>= h

Pregunta: ¿Las tres leyes de la mónada en la parte inferior se aplican de alguna manera por el idioma? ¿O son axiomas adicionales que debe aplicar para que la construcción de su lenguaje de una "Mónada" coincida con el concepto matemático de una "Mónada"?


Usted es responsable de hacer cumplir que una instancia de Monad obedece las leyes de la mónada. Aquí hay un ejemplo simple que no lo hace .

A pesar de que su tipo es compatible con los métodos de Monad , contar las veces que se ha usado el operador de enlace no es una Monad porque viola la ley m >>= return = m

{-# Language DeriveFunctor #-} import Control.Monad data Count a = Count Int a deriving (Functor, Show) instance Applicative Count where pure = return (<*>) = ap instance Monad Count where return = Count 0 (Count c0 a) >>= k = case k a of Count c1 b -> Count (c0 + c1 + 1) b