模式匹配矢量

时间:2014-03-02 13:45:14

标签: list vector sml smlnj

在SML中是否可以使用列表模式匹配矢量?

使用列表我可以简单地执行此操作:

fun foo ([]) = 0
  | foo (l::ls) = 1 + foo (ls);

我怎样才能为矢量做到这一点?

我试过fun foo (Vector.fromList([])) = 0,但这给了我这个错误:

Vector.fromList is not a constructor Found near Vector.fromList ([])

2 个答案:

答案 0 :(得分:3)

不经常。但是,一些SML实现 - 特别是SML / NJ - 支持矢量文字作为语言扩展。这些也可用于模式:

val v = #[1, 2, 3]
val #[x, y, _] = v

然而,矢量不是归纳构造的,所以你不能像列表那样匹配头尾。您只能匹配具有已知和固定长度的矢量,如上所述。

答案 1 :(得分:2)

你不能,不。

列表的值构造函数::nil公开as part of their interface,允许模式匹配。向量do not

这可能源于这样一个事实,即使用in-language数据类型可以很容易地实现列表,而提供常量时间访问向量更适合使用本机数组的编译器内实现。

请注意,您无法在Vector.fromList上进行模式匹配的原因是,它不是值构造函数,而是一个函数。 (与::nil不同。)