我可以将列表转换为带有类的长度索引向量吗? [英] Can I convert a list to a length indexed vector with a class?

查看:148
本文介绍了我可以将列表转换为带有类的长度索引向量吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了避免参差不齐的矩阵,我想设计一个包含长度类型的列表的类型包装器。 (请纠正我,如果我不应该称之为长度索引向量。)我想提供它作为具有智能构造函数的抽象类型,其中将是一个



这是我的地方:

 数据Nat = Z | S Nat 

data Vector(n :: Nat)a = Vector [a]导出显示

v0 ::向量Z a
v0 =向量[]

put :: a - >向量n a - >向量(S n)a
放入x(向量xs)=向量(x:xs)

class折叠一个
类型Elem a
fold :: [ Elem a] - > a

实例折叠(向量Z a)其中
类型Elem(向量Z a)= a
折叠[] = v0

实例折叠向量(S n)a)其中
类型Elem(向量(S n)a)= a
倍(x:xs)=放x(倍xs)

Fold typeclass应该从列表中逐个获取元素,放到vector中。我打算代表基本情况的实例以及沿着 Nat urals进行结构化归纳的归纳情况。然而,

然而, ,我发布的代码不起作用,我无法排除错误。实质上,它讨论了不同长度的向量的元素类型不相等:

  ... 
预期类型:[Elem(Vector na)]
实际类型:[Elem(Vector('s n)a)]
...
fold(x:xs)= put x(fold xs)
^^

如果我假设神奇的强制功能:

  fold(x:xs)= put x(fold $ undefined xs)

- 然后我会遇到另一个错误:

 由于使用'fold'而产生的折叠(向量na))
...
fold(x:xs)= put x(fold $ undefined xs)
^^^^^^ ^^^^^^^^^^^^^

这令我伤心,因为它意味着我



查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆