是否在Haskell中实施了monad法律?

时间:2016-05-09 20:01:49

标签: haskell monads

来自Haskell wiki:

  

可以将Monads视为各种标准编程接口   数据或控制结构,由Monad类捕获。所有   普通的monad是它的成员:

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
     

除了实现类函数外,还有所有实例   Monad应遵守以下等式或Monad Laws:

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

问题:底层的三个monad法律是否真的以任何方式强制执行?或者他们是必须执行的额外公理,以便你的语言构建一个" Monad"匹配" Monad"?

的数学概念

2 个答案:

答案 0 :(得分:22)

负责强制Monad实例遵守monad法律。这是的简单示例。

即使它的类型与Monad方法兼容,计算绑定运算符的使用次数也不是Monad,因为它违反了法律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

答案 1 :(得分:12)

不,monad法律不是由语言强制执行的。但是如果你不遵守它们,你的代码可能不一定像你在某些情况下所期望的那样。对于您的代码用户来说肯定会让您感到困惑。