【问题标题】:Keeping null value in tuple of a list in sml在 sml 列表的元组中保持空值
【发布时间】:2016-04-09 21:00:37
【问题描述】:

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

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

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

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

to ,比如:

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

【问题讨论】:

    标签: list sml smlnj


    【解决方案1】:

    如果列表中所有有效的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
    

    您可以像这样“更改”这些值:

    = 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 构造了一个新列表并将其绑定到名称gamma,而不是原地更改gamma。如果这个列表很大,这(以及对列表的恒定线性搜索)将变得非常低效。在某个阶段,您可能想开始使用可变数据结构(例如,refs 的排序数组)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多