【问题标题】:How can I update lists in SML using functions?如何使用函数更新 SML 中的列表?
【发布时间】:2017-09-06 01:49:15
【问题描述】:

我需要编写一个如下所示的 SML 函数:

update(FLR, (x,y))

其中 FLR 是元组的有限列表,如下所示:

[(1,1),(2,4),(3,9),(4,16)]

但它可以包含任意数量的元组。这个更新函数需要做的是将元组列表作为第一个参数,将一个 x / y 元组作为第二个参数。如果列表中有一个元组与给定函数的 x 值相同,则需要将列表的 y 值更新为给函数的 y 值。如果没有给定 x 值的元组,则函数需要在列表中的适当位置创建一个新元组。例如,如果 FLR 具有以下值:

FLR = [(1,1),(2,4),(3,9),(4,16),(5,25)]

并且函数被称为update(FLR, (2,3)); 新列表应该是[(1,1),(2,3),(3,9),(4,16),(5,25)]。另外,如果函数被调用为update(FLR, (6,36));,那么新列表应该是[(1,1),(2,4),(3,9),(4,16),(5,25), (6,36)]。

我对函数式编程和 SML 非常陌生,我不知道该怎么做。我已经编写了一些我确定需要使用的 memberOf 函数,但我主要关心的是如何使用递归来完成所有这些工作。非常感谢任何帮助!

【问题讨论】:

  • 你写map了吗?这非常相似:您需要遍历列表,一次处理一个元素,并生成一个新列表,其中的元素与原始列表中的元素 1:1 对应。
  • 这就是我遇到的麻烦。你能提供一些关于如何编写这个函数的见解吗?

标签: functional-programming sml caml ml


【解决方案1】:

您不应该使用memberOf,但您应该在实现列表和递归以及类似功能时应用您所学的知识。

即如何对列表的结构进行案例分析;

  • 为空列表做点什么
  • 对于非空列表,对其头部进行一些操作,并将结果与​​尾部递归的结果结合起来。

列表转换函数通常如下所示:

fun transform [] = []
  | transform (x::xs) = (do something with x) :: (transform xs)

例如,一个用给定数字替换每个 0 的函数:

fun replace_zero (a, []) = []
  | replace_zero (a, x::xs) = (if x = 0 then a else x) :: (replace_zero (a, xs)) 

希望这能让你重回正轨。

【讨论】:

  • 这很有意义。谢谢你。我可以使用它来更新列表中的元素,但是如果找不到该元素,我不确定如何添加到列表中。我只能更改现有元素的值。这是我的功能:
  • 趣味更新([], (x,y)) = [] | update((a,b)::ls, (x,y)) = (如果 x = a then (x,y) else (a,b)) :: (update(ls, (x,y))) ;
  • @bobertizkewl 如果你先解决空列表,我相信你会看到怎么做。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2019-08-14
相关资源
最近更新 更多