来自Haskell维基:
Monad可以被视为各种数据或控制结构的标准编程接口,由Monad类捕获.所有常见的monad都是它的成员:
Run Code Online (Sandbox Code Playgroud)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:
Run Code Online (Sandbox Code Playgroud)return a >>= k = k a m >>= return = m m >>= (\x -> k x >>= h) = (m >>= k) >>= h
问题:底层的三个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)
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |