什么是合适的数据类型?

don*_*ote 3 monads haskell

在这个问题上,寻求对monad实施的建设性批评,abesto要求人们批评他的"Monad",它一直计算绑定操作的数量.事实证明,这实际上不是一个单子,因为它不满足前两个monadic定律,但我发现这个例子很有趣.是否有适合此类结构的数据类型?

Edw*_*ang 7

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

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

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

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

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

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

  • 没有像样的Haskell编译器依赖于Monad实例遵守的monad法则,因为编译器无法验证它们.所以我们不需要Monadish; 我们已经拥有它了. (2认同)