在Idris中,您可以在类型本身中进行复杂的计算,例如此函数中的案例块:
fun_1 : (n : Nat) -> case n of { Z => Bool; _ => Nat}
fun_1 Z = True
fun_1 (S n) = S n
但是,如果n : Nat
(评估为Bool
或Nat
),您将如何全面评估此类结果?
作为参考,我有这个功能定义:
fun_2 : (n : Nat) -> n = Z -> Bool
fun_2 n nEqZ = ?fun_2_rhs
如何使用fun_1
实现此功能以便进行类型检查?
我尝试了以下两种方法,它们都给出了一个错误:
fun_2 : (n : Nat) -> n = Z -> Bool
fun_2 n nEqZ = rewrite nEqZ in (fun_1 n)
这给出了错误
在详细阐述fun_2的右侧时:重写没有改变类型 布尔
fun_2 : (n : Nat) -> n = Z -> Bool
fun_2 n nEqZ = replace nEqZ {P=(\nat => case nat of { Z => Bool; _ => Nat})} (fun_1 n)
这给出了错误
详细说明fun_2的右侧: 在详细说明函数替换的应用时:
Can't unify case block in fun_1 n n (Type of fun_1 n) with (\__pi_arg => Bool) n (Expected type) Specifically: Can't unify case block in fun_1 n n with Bool
唯一可能的方法是在Z
进行模式匹配并直接调用fun_1 Z
,这样吗?
fun_2 : (n : Nat) -> n = Z -> Bool
fun_2 Z Refl = fun_1 Z
我不太相信这种方法,因为类型中的计算可能比Z
和S n
上的简单模式案例分析更复杂,我不确定它是否会在这些情况下可能(或至少是直截了当的)
答案 0 :(得分:3)
如果你想让类型中的计算取得进展,它需要一些信息,所以是的,你需要模式匹配。重写不起作用,因为类型中的任何内容都没有n=Z
形式。
通常,在这样的类型中使用计算可以提供一些关于相应程序应该如何工作的有用提示,建议在哪里检查错误等。