gpt4 book ai didi

haskell - 我是否应该为可能适合该接口(interface)的类型实例化 Num 类型类?

转载 作者:行者123 更新时间:2023-12-02 20:58:52 24 4
gpt4 key购买 nike

在我看来,Num 类型类由相当任意的函数集合组成。有许多类型自然具有 +* 操作,但由于 的存在,作为 Num 的实例存在问题abssignumfromInteger。我找不到任何关于此类背后的设计哲学的讨论,因此我不清楚这里是否有合理的理由,或者是否是一个不幸的历史奇怪现象。

我将举例说明我的问题。假设我正在实现一个 Matrix 类,其组件为 Double 。我显然可以实现 +*-negate。也许 fromInteger x 可以给出一个 1x1 Matrix,其组件为 DoublefromInteger x。如何处理 abssignum 不太明显,但我可以想出一些满足规则的东西(来自类的文档):

abs x * signum x == x

对这个想法的反对意见是我的 Num 实例没有满足人们期望的 Num 的一些隐式规则。我的 * 是一个部分函数(假设 Matrix 的大小是运行时参数),这对于像 Double 这样的常见实例来说是不正确的和Int。而且它不通勤。无论我为 abssignum 想出什么,都不会满足每个人的期望。

对此反对意见的反对意见是,我的矩阵乘法无论如何都将是一个部分函数(并且在这种类型中似乎已被 Haskell 社区接受),那么为什么它会这样呢?特别是 * 是部分函数吗?如果我的 abssignum 满足文档中的规则,那么我就履行了我的 promise 。任何进一步依赖 Num 实例的人都是错误的。

Matrix这样的类型应该是Num的实例吗?

最佳答案

不要为非环创建 Num 个实例。这只是令人困惑。

当然,您通常可以定义做一些有用的事情的实例,但是如果它不是完全明显的什么,那么最好只定义一个带有描述性名称的普通函数,或者一些具有更好定义语义的较弱类实例。如果有人想将其与短运算符或多态 Num 函数一起使用,他们仍然可以在自己的模块中本地定义它(最好使用简单的 newtype 包装器。

特别是,一般(动态大小)矩阵的 Num 实例是有问题的,因为当尺寸不匹配时应该发生什么并不明显。您想概括什么行为?
我认为一个好的例子是固定二次大小的矩阵(即给定向量空间上的线性自同态)。在这种情况下,乘法显然是复合,并且数字文字将被视为常对角矩阵,因此1实际上是乘法恒等式。就像您在数学上下文中所写的内容一样。

但这与您任意选择数字文字大小为 1×1 的想法不兼容!人们期望 2 * m 能够工作,但它崩溃了。好吧,崩溃总比产生意想不到的结果要好;不幸的是,人们很容易想出一些巧妙的方法来以合适的方式定义乘法。例如,我们可以对较小的矩阵进行 block 对角复制,直到它足够大,也许只在 1×1 的情况下这样做......好吧,Matlab 会做这种临时的事情,但是拜托!我们不要such a horrible language作为好想法的典范。

如果你有一些明显是加法群的东西,实际上是向量空间,那么将其设为 VectorSpace !如果您还有乘法,但它是部分乘法,那么最好仅将其定义为普通函数。

如果您愿意,您可以为精细交错的 numeric-prelude 定义实例。类。就我个人而言(虽然我喜欢这个项目的想法),我还懒得在任何地方使用它,因为它需要费力去理解层次结构。

<小时/>

或者是?我想,麻烦已经从这里开始了hmatrix实际上在矩阵上实现了 * 作为逐元素乘法。这比Matlab还可怕!

关于haskell - 我是否应该为可能适合该接口(interface)的类型实例化 Num 类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32139212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com