来自 Haskell 维基:
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 定律:
return a >>= k = k a
m >>= return = m
m >>= (\x -> k x >>= h) = (m >>= k) >>= h
问题:语言实际上以任何方式强制执行底层的三个单子定律吗?或者它们是额外的公理you必须强制执行才能使“Monad”的语言构造与“Monad”的数学概念相匹配?
You负责强制执行Monad
实例遵守单子法则。这是一个简单的例子doesn't.
尽管它的类型与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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)