在sml

时间:2016-04-09 11:47:16

标签: list sml smlnj

我想使用具有规范的列表创建地图类型的数据结构:(string * int)list其中第一个元素是键,第二个元素是值。最初,当我创建这个地图时,我只想给予没有价值的关键。在这种情况下如何传递空值?例如,我在初始化时需要这样的东西:

val gamma = [("a",_),("b",_),("c",_)] :(string*int) list

当然,我应该可以编辑与某个键对应的值。例如,我应该能够改变

[("a",_),("b",_),("c",_)]

,比如说:

[("a",20),("b",30),("c",40)]

1 个答案:

答案 0 :(得分:1)

如果列表中的所有有效ints都是严格肯定的,您可以使用0作为空值,如果~1有效但可能使用0但是否定为int option不。否则,您可以使用fun set key value [] = [] | set key value ((k,v)::pairs) = if k = key then (k, SOME value) :: pairs else (k,v) :: (set key value pairs) fun lookup key ((k,v)::pairs) = if k = key then v else lookup key pairs fun initDict keys = map (fn k => (k,NONE)) keys; 。类似的东西:

- val gamma = initDict ["a","b","c"]: (string * int option) list;
val gamma = [("a",NONE),("b",NONE),("c",NONE)] : (string * int option) list

然后,例如:

= set "b" 30 gamma;
[("a",NONE),("b",SOME 30),("c",NONE)] : (string * int option) list

你可以改变"像这样的价值:

- lookup "a" gamma;
val it = NONE : int option
- lookup "b" gamma;
val it = SOME 30 : int option

值可以这样读:

lookup

请注意,如果密钥不在字典中,则NONE会引发错误。由于我们使用valOf作为条目的空值,因此它也可以作为缺少密钥的标志。

可以使用- valOf (lookup "b" gamma); val it = 30 : int 运算符从选项中提取实际值:

set

恐慌引用&#34;改变&#34;上面是因为使用此方法gamma构造一个新列表并将其绑定到名称gamma而不是更改refs。如果这个列表非常大,那么(以及列表上的常量线性搜索)将变得非常低效。在某些阶段,您可能希望开始使用可变数据结构(例如template <typename F, typename G> auto operator*(F f, G g) { return [f, g](auto... args) { return f(g(args...)); } } 的已排序数组)。