【问题标题】:Are there constants for infinity?无穷大有常数吗?
【发布时间】:2013-10-22 17:41:00
【问题描述】:

我注意到 Rascal 支持大整数。但我找不到无穷大的常数。它们存在吗?如果没有,我建议添加它们,因为有时它们非常有用。目前,我的解决方法是定义类似int pInf = 1024 的内容,但在极端情况下可能会失败。

【问题讨论】:

  • 无穷大常数有什么用?
  • 我不确定。但是在我的 Lisp 实现中,我想指定 Lisp 函数 list 的数量,它接受任意数量的参数。在数量检查中,它应该大于传递给此函数的任何数量的参数,无论多大。
  • 处理这种可变性的“流氓”方法是引入代数数据类型,如:data Arity = inf() | fixed(int size),然后您可以使用模式匹配或is 或其他任何方法来处理差异。 if (arity is inf) {...}int foo(fixed(int size)) = ...; int foo(inf()) = ...;
  • 啊,好主意。没想到。这确实是一个更好的解决方案,以避免依赖于实现。如果您将其放入答案中,我可以选择接受。
  • 好酷。我刚刚编辑了我之前的答案。干杯!

标签: rascal


【解决方案1】:

Rascal 中的有理数实际上支持无穷大(以零分母的形式),但这更多的是实现的副作用,而不是真正的设计选择,因此您可能不想指望它。我也不能保证所有极端情况都得到正确处理。

例如,

rascal>1r0
rat: 1r0

rascal>1r0*2
rat: 1r0

rascal>-1r0
rat: -1r0

rascal>-1r0*(-2)
rat: 1r0

rascal>1 / 1r0
rat: 0r

rascal>12345678901234567890 > 1r0
bool: false

rascal>25r0
rat: 1r0

rascal>25 / 0
|stdin:///|(5,1,<1,5>,<1,6>): ArithmeticException("/ by zero")


rascal>25 / 0r
rat: 1r0

【讨论】:

  • 哈,有趣。但似乎我在帮助中找不到关于有理数的文档。
  • 一些实验告诉我,Rascal 不会自动从整数向上转换为有理数。有没有库函数可以做到这一点?
  • 啊,我明白了。是的,它似乎在导师中没有记录。基本上,这个想法是将文字有理数写成 ArB,其中 A 是分子,B 是分母。您还可以将 Ar 写成整数有理数(例如 1r)。类型名称是“老鼠”。所有正常的数值运算符都可用,并且 int 将在必要时提升为rats(rats 也会在需要时提升为 reals)。基本算术应该经过充分测试且安全。
  • 它对我来说确实向上转型:1 + 0r => 1r; 1 > 0r 也有效。甚至 1 == 1r(你不知道我们和那个打了多久)。但是,[1] != [1r]。
  • 真的吗?我在有理数上定义了一个id 函数,将其应用于整数时,出现类型不匹配错误。
【解决方案2】:

在 Rascal 中不支持无穷大。

处理这种可变性的“流氓”方法是引入代数数据类型,如:

data Arity = inf() | fixed(int size)

然后您可以使用模式匹配或 is 或其他任何方法来处理差异。

if (arity is inf) {...}
int foo(fixed(int size)) = ...; 
int foo(inf()) = ...;

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2012-05-13
    • 2022-08-12
    • 2014-04-16
    • 2016-01-13
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多