列表中的方数然后将它们相加

时间:2018-03-21 22:12:51

标签: sml ml

我正在尝试创建一个函数,对ML列表的数字进行平方,然后将这些数字添加到

django-taggit

我所拥有的是一个列表,并返回每个数字的平方列表,但我无法弄清楚添加部分。

1 个答案:

答案 0 :(得分:1)

您可以一次解决一个子问题并撰写结果:

val sq = map (fn x => x*x)
val sum = foldl (fn (x, result) => x + result) 0
val sqsum = sum o sq

或者您可以将mapfoldl融合在一起:

val sqsum = foldl (fn (x, result) => x*x + result) 0

或者您可以使用递归定义编写此函数:

fun sqsum (x::xs) = x*x + sqsum xs
  | sqsum [] = 0

并最终将其改进为尾递归:

fun sqsum L =
    let fun f (x::xs) result = f xs (x*x + result)
          | f [] result = result
    in f L 0 end

即使像mapfoldl这样的高阶列表组合器非常有用并且一旦习惯了它们就提高了代码的可读性,使用手动递归解决入门练习对于学习非常有价值处理;毕竟,mapfoldl是以这种方式构建的。