伊德里斯的依赖元组?

时间:2018-01-08 15:54:13

标签: idris dependent-type

使用“**”语法糖写下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))

但这是有限的。当第三部分取决于第二部分时,这不再有效。

所以我仍然想知道建议的方法是什么?

1 个答案:

答案 0 :(得分:2)

如果从属元组的第三个组件的类型不依赖于第二个组件的值,那么您所显示的非依赖对是可行的方法。

如果您需要嵌套的依赖对,则需要为第二个组件指定名称:

v3 : (x : Int ** unusedName : Positive x ** IsEven x)