考虑以下(非常简化的)示例,该示例通过对其值的附带条件来约束数据类型:
data Transport = Car | Foot | Boat
total wheels : (transport : Transport) -> {auto hasWheels : transport = Car} -> Int
wheels Car {hasWheels = Refl} = 4
wheels Foot {hasWheels = Refl} impossible
wheels Boat {hasWheels = Refl} impossible
有什么办法可以省略或总结这些impossible
案例,而 Idris 仍然认为该功能是完整的吗?如果我确实留下了一个案例,我会得到类似的东西
Main.wheels is not total as there are missing cases
我也不能只是一个包罗万象的情况,因为编译器不知道_
不能是 Car 所以第二行不进行类型检查:
wheels Car {hasWheels = Refl} = 4
wheels _ {hasWheels = Refl} impossible
这给
wheels _ is a valid case
我已经浏览了这篇文章中关于约束数据类型的想法,但我没有看到任何有用的方法。
在实际代码中这是简化而来的,有很多情况需要单独排出,非常笨拙。