Haskell单子没有的身份范畴单子要求是什么?

4

2
是的,连同函子定律一起。 - chi
6
Haskell可能不会"强制执行"这些规则 - 也就是说,编译器不会拒绝违反它们的正确定义,但这仅因为对于每个实例来说自动检查这一点是不可能的。人们仍然理解任何实际情况都应该满足这些规则,否则事情很快就会出错。 - Robin Zigmond
1
@RobinZigmond,不是不可能的——我们只需要一些依赖类型和验证机制。呵呵,“只是” - luqui
1
@Gergely 你试过谷歌搜索吗?你可以在很多地方找到函子定律,这里是一个随机选择的链接:https://wiki.haskell.org/Functor#Functor_Laws - Robin Zigmond
2
@RobinZigmond 我想我指的是一种类似于Agda的“在实例化时必须提供证明”的方法。 - luqui
显示剩余3条评论
1个回答

7
与链接问题中被接受的答案相反,考虑这个实例。
newtype List a = List [a] deriving (Functor, Applicative)

instance Monad List where
    return _ = List []
    m >>= f = List []

一个编译器可以接受这个定义,但是它不遵守单子定律。具体来说,尝试确认一下:
m >>= return == m

针对[]List两者通用的情况:

-- Correct
Prelude> [1,2,3] >>= return
[1,2,3]

-- Not correct, should be List [1,2,3]
Prelude> List [1,2,3] >>= return
List []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接