令人惊讶的伊德里斯统一失败

时间:2014-11-23 22:47:07

标签: parsing unification idris

我正试图在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

1 个答案:

答案 0 :(得分:4)

类型检查器不会减少natToChar因为它不是全部 - 这基本上是为了防止你使用某些部分定义的函数来证明某些不正确的东西。

如果您正在编写此代码以处理在运行时出现的数据,可能需要的是DecMaybe

natToChar : (n : Nat) -> Maybe Char