什么是合适的数据类型?

时间:2011-03-23 09:18:57

标签: haskell monads

在问题中,Seeking constructive criticism on monad implementationabesto要求人们批评他的“Monad”,它一直计算绑定操作的数量。事实证明,这实际上不是一个单子,因为它不满足前两个monadic定律,但我发现这个例子很有趣。是否有适合此类结构的数据类型?

1 个答案:

答案 0 :(得分:7)

这是一个有趣的问题,与monad的数学谱系有关。

我们当然可以创建一个名为Monadish的类型类,它看起来与Monad类型类似:

class Monadish m where
  returnish :: a -> m a
  bindish :: m a -> (a -> m b) -> m b

因此,monad法则与类型类的实际签名无关;它们是实施者必须自己执行的额外信息。所以,从某种意义上说,答案是“当然”;只需制作另一个类型类,并说它不必满足任何法律。

但是这样的类型类很有意思吗?对于数学家来说,答案是:缺乏任何法则意味着没有任何有趣的结构可以用来推理。当我们定义数学结构时,我们通常定义一些对象(检查),一些操作(检查),然后定义一些操作属性(... nope)。我们需要所有这三个来证明关于这类对象的定理,而举一个例子,抽象代数就是采取相同的操作并添加更多或更少的定律。

对于软件工程师来说,答案有点复杂。不需要推理:您总是可以使用类型类来重载语法以用于您自己的恶意目的。我们可以使用类型类将“感觉”相同的事物组合在一起,即使我们没有任何正式的理由相信这样。这样做有一些好处,但我个人认为这会产生很多法律的好处,并导致建筑宇航员发明抽象结构而不需要考虑它们的适用性。数学是一个更安全的赌注:monad法则对应于左侧身份,正确身份和相关性,即使是非数学人士也会熟悉的合理基本假设。