在问题中,Seeking constructive criticism on monad implementation,abesto要求人们批评他的“Monad”,它一直计算绑定操作的数量。事实证明,这实际上不是一个单子,因为它不满足前两个monadic定律,但我发现这个例子很有趣。是否有适合此类结构的数据类型?
答案 0 :(得分:7)
这是一个有趣的问题,与monad的数学谱系有关。
我们当然可以创建一个名为Monadish
的类型类,它看起来与Monad
类型类似:
class Monadish m where returnish :: a -> m a bindish :: m a -> (a -> m b) -> m b
因此,monad法则与类型类的实际签名无关;它们是实施者必须自己执行的额外信息。所以,从某种意义上说,答案是“当然”;只需制作另一个类型类,并说它不必满足任何法律。
但是这样的类型类很有意思吗?对于数学家来说,答案是不:缺乏任何法则意味着没有任何有趣的结构可以用来推理。当我们定义数学结构时,我们通常定义一些对象(检查),一些操作(检查),然后定义一些操作属性(... nope)。我们需要所有这三个来证明关于这类对象的定理,而举一个例子,抽象代数就是采取相同的操作并添加更多或更少的定律。
对于软件工程师来说,答案有点复杂。不需要推理:您总是可以使用类型类来重载语法以用于您自己的恶意目的。我们可以使用类型类将“感觉”相同的事物组合在一起,即使我们没有任何正式的理由相信这样。这样做有一些好处,但我个人认为这会产生很多法律的好处,并导致建筑宇航员发明抽象结构而不需要考虑它们的适用性。数学是一个更安全的赌注:monad法则对应于左侧身份,正确身份和相关性,即使是非数学人士也会熟悉的合理基本假设。