![](/img/trans.png)
[英]Is it possible to create a recursive data type with rational numbers like -> data Nat = Zero | Succ Nat?
[英]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
的論據是什么? Float
是Enum
一個例子是否合理?
succ
函數本身的起源實際上與Haskell數據類型或枚舉無關,實際上succ
函數首先出現。 succ
函數實際上是無窮大公理中的后繼函數,它允許我們首先創建數字 。 它從來沒有設計用於浮點數/非自然數,這就是你遇到這個問題的原因。
在Haskell中修改浮點類型的succ
函數可能是個好主意,你應該向郵件列表提交一些關於它的東西。 雖然Haskell在Haskell98報告中是標准化的,所以不要對改變語言抱有希望。
如果您熟悉Haskell的類型類,請閱讀以下內容:您提到了succ
函數的不同可能用法,這就是為什么它被定義為Enum
類型類的函數。 因此,您可以輕松地重新綁定它以使用newtype
執行不同的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.