首页 文章

Haskells背后的基本原理`succ`数字(浮点数)

提问于
浏览
3

我有点惊讶地发现Haskell在数字上将 succ 函数定义为添加一个:

succ :: a - > a值的继承者 . 对于数字类型,succ添加1 .

虽然对于整数值,这似乎是合理的,但有一些问题:

  • 如果定义一个只能表示偶数/奇数/素数/ ...数字的数字系统,换句话说,一个专用类型是整数的子集,该怎么办?

  • 如果你定义某种代表半数和全数的"fixed-point number",那么不是所有数字都被枚举;和

  • floating point numbers 问题最严重 .

首先,它意味着 [2.0 :: Float .. 3.0 :: Float] (使用 :: Float 以确保调用不模糊)仅包含添加到原始值的整数值,而如果使用此表达式,他/她可能期望列表将包括所有浮点之间的所有浮点数 . 两个值;当然,这个论点更多的是人们喜欢什么 . 大多数程序员在这方面没有太多问题 .

更严重的是,如果使用表达式 [2.2 :: Float .. 4.0 :: Float] ,它会导致 [2.2,3.2,4.2] 4.2 在这做什么?

如果使用浮点数 +1 不能生成不同的数字(因为尾数没有足够的位来表示一个),它将无限循环 . 例如:

Prelude> [1e37 :: Float .. 1e37 :: Float]
[1.0e37,1.0e37,1.0e37,1.0e37,1.0e37,1^C.0e37,Interrupted.
Prelude> [1e37 :: Float .. 1e37-1 :: Float]
[1.0e37,1.0e37,1.0e37,1.0e37,1.0e37,1^C.0e37,Interrupted.
Prelude> [1e37 :: Float .. 1e37+1 :: Float]
[1.0e37,1.0e37,1.0e37,1.0e37,1.0e37,1^C.0e37,Interrupted.
Prelude> [1e37 :: Float .. pred 1e37 :: Float]
[1.0e37,1.0e37,1.0e37,1.0e37,1.0e37,1^C.0e37,Interrupted.

因此,即使列表应该为空或包含一些元素,也会产生无限量的值 .

部分论点确实有点挑剔,但至少对某些人来说,假设Haskell程序员最终会犯错误是合理的 .

生成下一个可表示的浮点数是不是更合理的方法?

以这种方式定义 succ 的论据是什么? FloatEnum 的实例是否合理?

1 回答

  • 7

    succ 函数本身的起源实际上与Haskell数据类型或枚举无关,实际上 succ 函数是第一位的 . succ 函数实际上是axiom of infinity中的 successor 函数,它允许我们create numbers in the first place . 它从未被设计为与浮点/非自然数一起使用,'s why you'遇到了这个问题 .

    在Haskell中修改浮点类型的 succ 函数可能是个好主意,你应该向邮件列表提交一些关于它的东西 . 虽然Haskell在Haskell98报告中是标准化的,所以不要对改变语言抱有希望 .

    Only read the following if you are familiar with Haskell's type classes: 您提到 succ 函数的不同可能用法,这就是为什么它被定义为 Enum 类类的函数 . 因此,您可以轻松地重新绑定它以使用 newtype 执行不同的操作 .

相关问题