伊德里斯: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
只是 LT
、EQ
和 GT
。我得到的错误如下:
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
的类型要求 x
与 0
的类型*相同,您尚未指定。尝试
sign : (Ord elem, Num elem) => elem -> ZeroOrSign
* 或者有适当的转换。我不太明白这是如何工作的,但 Num
似乎就足够了,可能是由于 fromInteger
将 0
转换为 elem
类型
我有一个非常简单的例子,作为如何使用不进行类型检查的 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
只是 LT
、EQ
和 GT
。我得到的错误如下:
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
的类型要求 x
与 0
的类型*相同,您尚未指定。尝试
sign : (Ord elem, Num elem) => elem -> ZeroOrSign
* 或者有适当的转换。我不太明白这是如何工作的,但 Num
似乎就足够了,可能是由于 fromInteger
将 0
转换为 elem