完成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
}。
答案 0 :(得分:2)
TupleVectType
的定义实际上是TupleVect
应该是什么。练习要求您实现一个函数TupleVect
,它返回 n - 元组表示向量的类型。
您对TupleVect
的定义是通常称为replicate
的实现,它通过复制 n将<{1}}传递给向量x : a
3} em>次。
总之,根据您的定义,可以按预期进行以下类型检查:
repeat x : Vect n a
所以我建议将foo : TupleVectType 4 Nat
foo = (1, 2, 3, 4, ())
重命名为TupleVectType
。