簡體   English   中英

Haskells背后的基本原理`succ`數字(浮點數)

[英]Rationale behind Haskells `succ` on numbers (floats)

我有點驚訝地發現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.

因此,即使列表應該為空或包含一些元素,也會產生無限量的值。

部分論點確實有點挑剔,但至少對某些人來說,假設Haskell程序員最終會犯錯誤是合理的。

生成下一個可表示的浮點數是不是更合理的方法?

以這種方式定義succ的論據是什么? FloatEnum一個例子是否合理?

succ函數本身的起源實際上與Haskell數據類型或枚舉無關,實際上succ函數首先出現。 succ函數實際上是無窮大公理中后繼函數,它允許我們首先創建數字 它從來沒有設計用於浮點數/非自然數,這就是你遇到這個問題的原因。

在Haskell中修改浮點類型的succ函數可能是個好主意,你應該向郵件列表提交一些關於它的東西。 雖然Haskell在Haskell98報告中是標准化的,所以不要對改變語言抱有希望。

如果您熟悉Haskell的類型類,請閱讀以下內容:您提到了succ函數的不同可能用法,這就是為什么它被定義為Enum類型類的函數。 因此,您可以輕松地重新綁定它以使用newtype執行不同的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM