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

Wil*_*sem 3 floating-point haskell enumerable

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

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

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

  • 如果你定义一个只能表示偶数/奇数/素数/ ...数字的数字系统,换句话说,一个专用类型是整数的子集,该怎么办?
  • 如果你定义某种代表半数和全数的"定点数",那么不是所有数字都是枚举的; 和
  • 浮点数问题最严重.

首先,它意味着[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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

succ以这种方式定义的论点是什么?这Float是一个实例是否合理Enum

ran*_*ame 7

succ函数本身的起源实际上与Haskell数据类型或枚举无关,实际上succ函数首先出现.该succ函数实际上是无穷大公理中后继函数,它允许我们首先创建数字.它从来没有设计用于浮点数/非自然数,这就是你遇到这个问题的原因.

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

如果您熟悉Haskell的类型类,请阅读以下内容:您提到succ函数的不同可能用途,这就是为什么它被定义为Enum类型类的函数.因此,您可以轻松地重新绑定它以执行与a不同的操作newtype.