5

由于 lambda 演算,Haskell 比许多语言更具数学性,但我认为域对于数字是不完整的:例如,我们有Integerand ,但没有or , or作为域。这有时会使函数不安全,而编译器可能已经捕获了类型错误。例如:mod仅在运行时 输出。但我们可以有类似的东西;类似守卫、间隔或其他数据类型的东西……在游戏中,我希望我的角色在其生命中拥有一个正数。或者从 0 到 100,不下,不上。当他被击中时,我需要打电话给丑陋的人。甚至 C 也有和。FloatPositiveNegative[1..5]50*** Exception: divide by zeromod :: Integral a => a -> a -> amod :: Integral a, a != 0 => a -> a -> apositive x = if x > 0 then x else 0signedunsigned

这是一个弱点还是他们没有“间隔”域的原因?有解决这个问题的包吗?

4

2 回答 2

6

听起来您正在寻找一种依赖类型的语言,例如 Agda、Idris 或 Coq。

你是对的,限制数字类型会很好,但你也需要考虑如何使用这些类型。假设您的类型mod排除了一个0值。现在你需要在你的程序中调用它。如果数字是文字,编译器可能“容易”确定它不是0并让您调用该函数,但如果数字是在运行时提供的,可能来自用户输入或一些复杂的过程怎么办?您需要某种方式向编译器解释您知道0当您将数字传递给mod. Haskell 并没有以任何简单的方式做到这一点的工具(有一些烦人的方式,比如将所有值反映到类型系统中),这就是你不这样做的原因

于 2012-07-15T22:12:36.280 回答
6

你可以自由地创建这样的类,但也许它们没有被包含在 Haskell 中的原因是人们找不到让它们经常有用的方法。

很明显,您希望对您的班级进行减法,但您也希望将其关闭。

可能是这样的?

NonNegative x - NonNegative y = NonNegative (max (x - y) 0)

但随后身份x - y + y == x不成立。

人们为 Haskell 制作了替代的数字层次结构,例如'Numeric Prelude'。Haskell 对自定义非常友好,你甚至可以用自己的定义替换 Prelude,但它们是否有用并且不会引起比它们解决的问题更多的问题是另一回事。

于 2012-07-16T02:51:18.920 回答