繁体   English   中英

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

[英]Are monad laws enforced in Haskell?

来自Haskell维基:

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

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

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

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

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

有责任强制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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM