为什么赢得以下类型检查:
v1 : mod 3 2 = 1
v1 = Refl
然而,这将很好地解决问题:
v2 : 3 - 2 = 1
v2 = Refl
答案 0 :(得分:5)
这是由于mod
功能的偏倚(感谢@AntonTrunov澄清)。它是多态的,默认数字常量是Integer
s。
Idris> :t mod
mod : Integral ty => ty -> ty -> ty
Idris> :t 3
3 : Integer
Idris> :t mod 3 2
mod 3 2 : Integer
对于Integer
类型mod
,函数不是完全的。
而是使用modNatNZ
函数,因此所有类型都可以完美地检查并运行。
v1 : modNatNZ 3 2 SIsNotZ = 1
v1 = Refl