嵌套对运动

时间:2016-04-16 03:07:07

标签: idris

完成Type-Driven Development with Idris

的ch6练习

练习3个州:

  

我们可以将矢量实现为嵌套对,并使用从中计算嵌套   长度。例如:

TupleVect 0 ty = ()
TupleVect 1 ty = (ty, ())
TupleVect 2 ty = (ty, (ty, ()))
     

定义实现此功能的类型级别函数TupleVect   行为。请记住以TupleVect的类型开头。当你有   正确的答案,以下定义是有效的:

test : TupleVect 4 Nat
test = (1,2,3,4,())

这是我想出的:

TupleVectType : Nat -> (a : Type) -> Type
TupleVectType Z     _ = ()
TupleVectType (S n) a = (a, TupleVectType n a)

TupleVect : (n : Nat) -> a -> TupleVectType n a
TupleVect Z _     = ()
TupleVect (S n) a = (a, TupleVect n a)

我认为这已经足够了,但MyTupleVect 4 Nat是错的:

*Exercises> TupleVect 4 Nat
(Nat, Nat, Nat, Nat, ()) : (Type, Type, Type, Type, ())

但是,如果我提供实际值,即不是Type,则返回:

*Exercises> TupleVect 4 True
(True, True, True, True, ()) : (Bool, Bool, Bool, Bool, ())

请告诉我如何更正此TupleVect功能以匹配预期输出。

我不清楚如何提供TupleVect 4 Nat,然后列举Nat,但是从1开始,而不是0 }。

1 个答案:

答案 0 :(得分:2)

TupleVectType的定义实际上是TupleVect应该是什么。练习要求您实现一个函数TupleVect,它返回 n - 元组表示向量的类型

您对TupleVect的定义是通常称为replicate的实现,它通过复制 n将<{1}}传递给向量x : a 次。

总之,根据您的定义,可以按预期进行以下类型检查:

repeat x : Vect n a

所以我建议将foo : TupleVectType 4 Nat foo = (1, 2, 3, 4, ()) 重命名为TupleVectType