Idris 中依赖类型函数的问题

Problem with dependent types function in Idris

我刚刚开始阅读“类型驱动开发”一书,并尝试使用依赖类型的简单示例。它应该 return 一个字符串表示负数,一个整数表示正数。 我从 2 个孔开始:

StringOrInt : Bool -> Type
StringOrInt b =
  case b of
    True => Integer
    False => String

getStringOrInt : (x : Integer) -> StringOrInt (x > 0)
getStringOrInt x =
  case x > 0 of
    True => ?x
    False => ?s

如果我看一下孔的定义,它看起来非常复杂而且一点用处都没有:

x : case with block in Prelude.Interfaces.Prelude.Interfaces.Integer implementation of Prelude.Interfaces.Ord, method > (ifThenElse (intToBool (prim__eqBigInt x 0))
                (Delay EQ)
                (Delay (ifThenElse (intToBool (prim__sltBigInt x
                                                               0))
                                   (Delay LT)
                                   (Delay GT))))
    x
    0 of
      True => Integer
      False => String

那么这个函数怎么写呢?

使用 with 而不是 case 来利用依赖模式匹配,并让类型检查器在每个备选方案的结果类型中用适当的布尔值替换 x > 0

StringOrInt : Bool -> Type
StringOrInt True  = Integer
StringOrInt False = String

getStringOrInt : (x : Integer) -> StringOrInt (x > 0)
getStringOrInt x with (x > 0)
  getStringOrInt x | True  = x
  getStringOrInt x | False = "<= 0"