Haskell是否实施单子法?
来自Haskell wiki:
Monad可以被看作是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方法兼容,计算绑定操作符被使用的次数也不是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
不,单子法不是由语言强制执行的。 但是如果你不遵守它们,你的代码在某些情况下可能不一定像你所期望的那样。 它肯定会让你的代码用户感到困惑。
链接地址: http://www.djcxy.com/p/7435.html上一篇: Are monad laws enforced in Haskell?
下一篇: What is difference between functional and imperative programming languages?
