【问题标题】:Updating a list of 2-tuples in SML更新 SML 中的 2 元组列表
【发布时间】:2018-04-11 15:33:07
【问题描述】:

我正在尝试更新 SML 中 2 元组的运行列表。这与以下问题相同:How can I update lists in SML using functions?

不幸的是,答案没有帮助。首先,这是我的代码:

fun member(a, []) = false
  | member((a, b), (c, d)::cds) = a = c orelse member((a, b), cds);

fun update([], (loc, v)) =  [(loc, v)]
  | update((y, z)::yzs, (loc, v)) =
    if member((loc, v), (y, z)::yzs) then 
    if loc = y then (loc, v)::yzs
    else (y, z)::update(yzs, (loc, v))
    else (y, z)::yzs@[(loc, v)];

我可以调用 FLR 上的更新函数来创建新值,但只能更新最后一个值。此外,当最后一个值被添加并且我再次调用更新函数时,它并没有附加到 FLR。这是我的例子:

- val FLR = [(1,1),(2,4),(3,9),(4,16),(5,25)];
val FLR = [(1,1),(2,4),(3,9),(4,16),(5,25)] : (int * int) list
- update(FLR, (6,36));
val it = [(1,1),(2,4),(3,9),(4,16),(5,25),(6,36)] : (int * int) list
- update(FLR, (7,42));
val it = [(1,1),(2,4),(3,9),(4,16),(5,25),(7,42)] : (int * int) list

我有没有办法将新列表的值分配给 FLR,而不是将值分配给“它”?此外,我无法向空列表添加新值?有什么建议吗?

【问题讨论】:

  • update 实际上并没有更改其输入,它返回一个包含所需更改的新输出。要获取新值,只需将其再次绑定到FLR,例如val FLR = update(FLR, (6, 36));
  • 嗨@Oshua,欢迎来到 StackOverflow!不要重复现有问题。相反,如果您有一个与现有问题如此相关的问题,请在评论中提出一个澄清问题,例如“我能够调用更新函数 FLR 来创建新值,但只能更新最后一个值。[.. .]"

标签: sml smlnj


【解决方案1】:

正如 Yawar 所指出的,您的代码似乎可以工作,但是必须将 mutating variables 以查看更新的想法替换为 shadowing bindings,新创建的值略有不同.

您的代码可以简化:

fun member ((x,_), xs) = List.exists (fn (y,_) => x = y) xs

fun update ([], (x,v)) = [(x,v)]
  | update ((y,w)::pairs, (x,v)) =
      if x = y
      then (x,v) :: pairs  (* replace (y,w) with (x,v), stop *)
      else (y,w) :: update (pairs, (x,v)) (* keep (y,w), continue *)

也就是说,您不需要memberinside update 告诉您列表是否需要更新,因为这需要member 递归遍历列表并返回truefalse对于插入/替换应该发生的位置,没有太多可显示的内容。

member 先取对,再取列表,而update 先取列表,再取对,这似乎有点不对称。在设计 API 时,请尽量保持一致。

yzs@[(loc, v)] 是不好的,在你的情况下,可能是不必要的。单个元素的这种插入将遍历整个列表,新对的效果在列表末尾结束。您可以使用 (loc, v)::(y, z)::yzs 代替 (y, z)::yzs@[(loc, v)] 来将其减少为恒定时间操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多