如何使用函数更新SML中的列表?

时间:2017-04-10 21:11:37

标签: functional-programming sml caml ml

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

update(FLR, (x,y))

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

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

但它可以包含任意数量的元组。此更新函数需要做的是将元组列表作为第一个参数,将x / y元组作为第二个参数。如果列表中的元组具有与给予函数的x值相同的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的新手,我不知道如何做到这一点。我已经编写了一些我确定需要使用的成员函数,但我主要担心的是如何使用递归来完成所有这些操作。非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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)) 

这应该有希望让你回到正轨。