在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 ([])
答案 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
不同。)