gpt4 book ai didi

haskell - 为什么 Num 类型类有一个 abs 方法?

转载 作者:行者123 更新时间:2023-12-04 07:03:27 27 4
gpt4 key购买 nike

我正在考虑函数式语言的标准库(或前奏)。

如果我有 Ord n 的实例, 那么实现 abs 是微不足道的:

abs n = if n > 0 then n else (-n)

在向量空间的情况下,向量的绝对值(长度)非常重要。但是类型不匹配,因为向量的绝对值不是向量:它是一个实数。

拥有 abs 的设计原理是什么? (或 signum )作为 Num 的一部分类型类?

最佳答案

向量不好Num候选人。有a dedicated class for those .

但是Num有许多没有 Ord 的有用实例.基本上,(Num, Ord) ≈ Real在 Haskell 中,它非常清楚地暗示了明显的非 Ord 类型是更高的 division algebras , 主要是 Complex .在这里,abs又不是很完美,因为它可以返回一个实数,但因为这些是返回 Complex 的复平面的子集没有错。

其他示例是更抽象的类型,例如

instance (Num n) => Num (a->n) where
f+g = \x -> f x + g x
...
abs f = abs . f

这不是 Ord仅仅因为你不能完全评估一个函数,只能评估它的返回值。 (这也阻止了 Eq 实例,因此这在 Haskell98 中是不合法的,其中 EqNum 的父类(super class))。

解决标题中的问题:将 abs 放入是否是一个好主意有点争议。在 Num . numeric prelude有它作为 a complete seperate class ,它允许您制作例如还向量化其他 num 类的实例,但不是 Absolute.C 的实例.缺点是这会导致更复杂的类层次结构,这通常是不值得的。

关于haskell - 为什么 Num 类型类有一个 abs 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18757159/

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