我正试图在Idris中制作一个可以称为可判定解析器的东西。起初我只是在寻找解析自然数,但遇到了一个意想不到的问题。产生它的代码的最小示例是:
data Digit : Char -> Type where
Zero : Digit '0'
One : Digit '1'
digitToNat : Digit a -> Nat
digitToNat Zero = 0
digitToNat One = 1
natToChar : Nat -> Char
natToChar Z = '0'
natToChar (S Z) = '1'
natToDigit : (n : Nat) -> Digit (natToChar n)
natToDigit Z = Zero
natToDigit (S Z) = One
我希望这可以编译,但我会得到
When elaborating right hand side of natToDigit:
Can't unify
Digit '0'
with
Digit (natToChar 0)
Specifically:
Can't unify
'0'
with
natToChar 0
但是natToChar 0
明显等于'0'
,所以我不明白这里的问题是什么。
更新
我还问了一个与我想要做的事情更直接相关的问题here。
答案 0 :(得分:4)
类型检查器不会减少natToChar
因为它不是全部 - 这基本上是为了防止你使用某些部分定义的函数来证明某些不正确的东西。
如果您正在编写此代码以处理在运行时出现的数据,可能需要的是Dec
或Maybe
:
natToChar : (n : Nat) -> Maybe Char