在sml列表的元组中保留空值
Keeping null value in tuple of a list in sml
我想使用具有规范 :(string*int) 列表的列表创建一种映射类型的数据结构,其中第一个元素是键,第二个元素是值。最初当我创建这张地图时,我只想提供没有价值的钥匙。在这种情况下如何传递空值?比如我在初始化的时候需要这样的东西:
val gamma = [("a",_),("b",_),("c",_)] :(string*int) list
当然,我应该可以编辑某个键对应的值。例如,我应该可以更改
[("a",_),("b",_),("c",_)]
对,说这样的话:
[("a",20),("b",30),("c",40)]
如果列表中的所有有效 ints
都是严格正数,您可以使用 0
作为空值,或者如果 0
有效但可能 ~1
底片不是。否则,您可以使用 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
您可以 "change" 这样的值:
= 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
上面 "change" 周围的引号是因为使用这种方法 set
构造了一个新列表并将其绑定到名称 gamma
而不是就地更改 gamma
.如果这个列表很大,这(以及对列表的恒定线性搜索)将变得非常低效。在某个阶段,您可能想开始使用可变数据结构(例如 refs
的排序数组)。
我想使用具有规范 :(string*int) 列表的列表创建一种映射类型的数据结构,其中第一个元素是键,第二个元素是值。最初当我创建这张地图时,我只想提供没有价值的钥匙。在这种情况下如何传递空值?比如我在初始化的时候需要这样的东西:
val gamma = [("a",_),("b",_),("c",_)] :(string*int) list
当然,我应该可以编辑某个键对应的值。例如,我应该可以更改
[("a",_),("b",_),("c",_)]
对,说这样的话:
[("a",20),("b",30),("c",40)]
如果列表中的所有有效 ints
都是严格正数,您可以使用 0
作为空值,或者如果 0
有效但可能 ~1
底片不是。否则,您可以使用 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
您可以 "change" 这样的值:
= 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
上面 "change" 周围的引号是因为使用这种方法 set
构造了一个新列表并将其绑定到名称 gamma
而不是就地更改 gamma
.如果这个列表很大,这(以及对列表的恒定线性搜索)将变得非常低效。在某个阶段,您可能想开始使用可变数据结构(例如 refs
的排序数组)。