是否有可能在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 ([])
是否有可能在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 ([])
你不能,没有。
列表具有它们的值构造函数,::
和nil
暴露了as part of their interface,允许模式匹配。矢量do not。
这可能来源于这样的事实,即列出在语言使用的数据类型比较容易实现的,同时提供恒定时间访问矢量使其本身更多使用本地阵列的在编译器实现。
请注意,您无法在Vector.fromList
上进行模式匹配的原因是,它不是值构造函数,而是一个函数。 (不像::
和nil
)
没有定期。然而,一些SML实现 - 特别是SML/NJ - 支持矢量文字作为语言扩展。那些也可以用于模式:
val v = #[1, 2, 3]
val #[x, y, _] = v
但是,载体不是由感应构建的,因此您不能像列表一样匹配头部和尾部。只能匹配具有已知长度和固定长度的向量,如上所述。