使用“**”语法糖写下Idris中的依赖对是很容易的:
data Positive : Int -> Type where
OneIsPositive : Positive 1
SucIsPositive : Positive i -> Positive (i+1)
data IsEven : Int -> Type where
ZeroIsEven : IsEven 0
Add2IsEven : IsEven i -> IsEven (i+2)
Sub2IsEven : IsEven i -> IsEven (i-2)
v1 : (x : Int ** Positive x)
v1 = (1 ** OneIsPositive)
v2 : (x : Int ** IsEven x)
v2 = (2 ** Add2IsEven ZeroIsEven)
但是当我想在元组中添加更多内容时,我失败了(以下代码导致错误):
v3 : (x : Int ** Positive x ** IsEven x)
v3 = (2 ** SucIsPositive OneIsPositive ** Add2IsEven ZeroIsEven)
所以,一般来说,当我想将2个以上的元素放入Dependent Pair(Tuple)时,我该怎么办?
我发现在这种情况下我可以使用嵌套的正常元组来执行此操作:
v3 : (x : Int ** (Positive x, IsEven x))
v3 = (2 ** (SucIsPositive OneIsPositive, Add2IsEven ZeroIsEven))
但这是有限的。当第三部分取决于第二部分时,这不再有效。
所以我仍然想知道建议的方法是什么?
答案 0 :(得分:2)
如果从属元组的第三个组件的类型不依赖于第二个组件的值,那么您所显示的非依赖对是可行的方法。
如果您需要嵌套的依赖对,则需要为第二个组件指定名称:
v3 : (x : Int ** unusedName : Positive x ** IsEven x)