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"
我刚刚开始阅读“类型驱动开发”一书,并尝试使用依赖类型的简单示例。它应该 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"