Sml 将列表中的数字平方,然后将它们相加

Sml 将列表中的数字平方,然后将它们相加,sml,ml,Sml,Ml,我试图创建一个函数,将ML列表中的数字平方,然后将这些数字相加 fun sqsum(lst) = map (fn x => x*x) lst; 我这里有一个列表,并返回每个数字的平方列表,但我无法计算出加法部分。您可以一次解决一个子问题,然后合成结果: val sq = map (fn x => x*x) val sum = foldl (fn (x, result) => x + result) 0 val sqsum = sum o sq 或者您可以将map和foldl

我试图创建一个函数,将ML列表中的数字平方,然后将这些数字相加

fun sqsum(lst) = map (fn x => x*x) lst;

我这里有一个列表,并返回每个数字的平方列表,但我无法计算出加法部分。

您可以一次解决一个子问题,然后合成结果:

val sq = map (fn x => x*x)
val sum = foldl (fn (x, result) => x + result) 0
val sqsum = sum o sq
或者您可以将
map
foldl
融合在一起:

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

尽管像
map
foldl
这样的高阶列表组合词非常有用,一旦你习惯了它们,就可以提高代码的可读性,但使用手动递归解决介绍性练习对学习过程非常有价值;毕竟,
map
foldl
是这样构建的。

编写一个函数
sum
,将列表中的元素相加而不求平方。把它应用到你的平方列表中。