何时在Haskell中选择“Natural”而不是“Integer”?

10
不久前我在base中发现了Natural数据类型。在我看来,当您打算使用非负整数类型时,应该使用它。但是并不完全清楚为什么我应该更喜欢Natural而不是Integer。两种类型都具有任意精度,并且都具有相当优化的运行时表示-Integer表示Natural表示。但是,当您减去自然数时,Natural可能会抛出纯异常,这并没有真正为您的代码增加更多的类型安全性。而Integer在所有软件包中更受欢迎。

那么,何时以及为什么应该使用Natural


1
这可能有点主观,但我的标准是“如果你宁愿选择运行时错误而不是负结果,请选择Natural”。 - chi
@chi 同意。虽然我们在 Num 类型类中有 negate(-),但我们无法阻止减法的发生。 - Shersh
1个回答

6
我不明白为什么你要使用Natural或者 Integer。为什么不用Rational呢?它是任意精度的,拥有优化的运行表示,并且适用于自然数、整数,以及有理数!
我的观点是,我们应该选择在语义上有意义的类型。我们可以使用自然数来计算街道上的房屋数量,使用整数来记录下一场高尔夫比赛,使用有理数来分割一个新鲜的蓝莓派。

我不知道这段话中有哪些部分是讽刺的。我认为你应该更清楚地表达你的观点。 - leftaroundabout
@leftaroundabout,我鼓励你以不同的修辞风格再添加一个答案。 - erisco
@erisco 选择Natural的原因是语义感觉是一个很好的理由。但是,为什么不使用newtype Natural = Natural Integer呢?RationalIntegerNatural慢得多,因为需要不断调用gcd函数。但是不清楚哪个——Natural还是Integer——由于编译器优化和内联等所有东西而变慢。我的问题不仅仅是“我有两种类型,嗯...我应该使用哪个?我太蠢了,我不能选择”。而是为什么要创建这样的具有这种语义的Natural类型。为什么要使用异常而不是饱和?我可以获得什么好处? - Shersh
@erisco为什么Haskell本身不坚持语义上合理的选择呢?例如,:t length显示其结果类型为Int而非Natural,如果你自己想坚持语义上合理的选择,这可能很烦人。length的类型设计背后的动机是什么? - wstomv
@TomVerhoeff 使用“Int”的动机是因为大多数CPU上32位有符号整数操作速度更快。否则,您可以使用“genericLength”。 - erisco
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接