伊德里斯:Ord/Num 的问题

Idris: issue with Ord/Num

我有一个非常简单的例子,作为如何使用不进行类型检查的 case _ of 的演示,我无法理解问题所在:

data ZeroOrSign = Zero | Pos | Neg

sign : Ord elem => elem -> ZeroOrSign
sign x = case compare x 0 of
            LT => Neg
            EQ => Zero
            GT => Pos

函数 compare 在 Prelude 中定义,compare : Ord ty => ty -> ty -> Ordering 其中 Ordering 只是 LTEQGT。我得到的错误如下:

When checking right hand side of sign with expected type
        ZeroOrSign

When checking an application of function Prelude.Interfaces.compare:
        Ord elem is not a numeric type

如果我尝试定义 sign : Num elem => elem -> ZeroOrSign 那么这当然会产生问题,因为 idris 无法找到为 Num 类型定义的函数 compare

我很困惑,有什么提示吗?

compare 的类型要求 x0 的类型*相同,您尚未指定。尝试

sign : (Ord elem, Num elem) => elem -> ZeroOrSign

* 或者有适当的转换。我不太明白这是如何工作的,但 Num 似乎就足够了,可能是由于 fromInteger0 转换为 elem

类型