如何充分评估类型中的案例块

时间:2015-08-20 05:21:02

标签: dependent-type idris type-level-computation

在Idris中,您可以在类型本身中进行复杂的计算,例如此函数中的案例块:

fun_1 : (n : Nat) -> case n of { Z => Bool; _ => Nat}
fun_1 Z = True
fun_1 (S n) = S n

但是,如果n : Nat(评估为BoolNat),您将如何全面评估此类结果?

作为参考,我有这个功能定义:

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

我不太相信这种方法,因为类型中的计算可能比ZS n上的简单模式案例分析更复杂,我不确定它是否会在这些情况下可能(或至少是直截了当的)

1 个答案:

答案 0 :(得分:3)

如果你想让类型中的计算取得进展,它需要一些信息,所以是的,你需要模式匹配。重写不起作用,因为类型中的任何内容都没有n=Z形式。

通常,在这样的类型中使用计算可以提供一些关于相应程序应该如何工作的有用提示,建议在哪里检查错误等。