在agda中已知的模式匹配

时间:2016-09-14 07:02:08

标签: haskell agda

粗略地说,我有

check : UExpr -> Maybe Expr

我有一个测试期

testTerm : UExpr

我希望check成功,之后我想提取结果Expr并进一步操作它。基本上

realTerm : Expr
just realTerm = check testTerm

如果check testTerm原来是nothing,那么这个定义将无法进行类型检查。这可能吗?

2 个答案:

答案 0 :(得分:10)

通常的协议是写一些像

这样的东西
Just : {X : Set} -> Maybe X -> Set
Just (just x) = One -- or whatever you call the fieldless record type
Just nothing = Zero

justify : {X : Set}(m : Maybe X){p : Just m} -> X
justify (just x) = x
justify nothing {()}

如果m计算成功,则p的类型为One,并推断出该值。

答案 1 :(得分:2)

嗯,我找到了一种方法来做到这一点,这有点奇怪和神奇。

testTerm-checks : Σ Expr (\e -> check testTerm ≡ just e)
testTerm-checks = _ , refl

realTerm : Expr
realTerm = proj₁ testTerm-checks

这给了我heebie jeebies,但不一定是坏的方式。仍然对其他方式感兴趣。