在哈斯克尔执行monad法律吗?

Geo*_*rge 19 monads haskell

来自Haskell维基:

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
Run Code Online (Sandbox Code Playgroud)

除了实现类函数之外,Monad的所有实例都应遵循以下等式或Monad Laws:

return a >>= k  =  k a
m >>= return  =  m
m >>= (\x -> k x >>= h)  =  (m >>= k) >>= h
Run Code Online (Sandbox Code Playgroud)

问题:底层的三个monad法律是否实际上以语言强制执行?或者它们是否必须强制执行的额外公理,以便你的"Monad"语言结构与"Monad"的数学概念相匹配?

Cir*_*dec 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
Run Code Online (Sandbox Code Playgroud)


Fre*_*e_D 12

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