【问题标题】:ML anonymous function alternating sumML 匿名函数交替求和
【发布时间】:2014-12-27 22:55:33
【问题描述】:

对于我在 ML 中的家庭作业,我必须使用 fold 函数和匿名函数将整数列表转换为交替和。如果列表为空,则结果为 0。这是我目前所拥有的。我认为我所拥有的是正确的,但我最大的问题是我无法弄清楚如何将我所拥有的东西写成匿名函数。任何帮助将不胜感激。

    fun foldl f y nil = y
    | foldl f y (x::xr) = 
    foldl f(f(x,y))xr;

    val sum = foldl (op -) ~6[1,2,3,4,5,6];

    val sum = foldl (op -) ~4[1,2,3,4];

    val sum = foldl (op -) ~2[1,2];

这些只是我测试的一些例子,看看我的工作是否有效,我认为这三个都是正确的。

【问题讨论】:

    标签: function anonymous ml


    【解决方案1】:

    有两种情况:一种是列表长度为偶数,另一种是列表长度为奇数。如果我们有一个列表[a,b,c,d,e],那么交替总和就是a - b + c - d + e。您可以将其重写为

    e - (d - (c - (b - a)))

    如果列表的长度是偶数,例如[a,b,c,d],那么我们可以将其交替和写为

    - (d - (c - (b - a))).

    所以为了解决这两种情况,我们可以让我们的折叠累加器是一个三元组,如果列表是奇数,第一个条目是正确的值,如果列表是偶数,第二个条目是正确的值,第三个值告诉我们查看过的元素的数量,我们可以在最后知道答案是第一个条目还是第二个条目。

    这样的匿名函数

    fn (x,y,n) => (x - #1 y, ~(x + #2 y), n + 1)
    

    会起作用,我们可以将它与 foldl 一起使用,起始累加器为 (0,0,0),所以

    fun alternating_sum xs =
      let
        (v1, v2, n) = foldl (fn (x,y,n) => (x - #1 y, ~(x + #2 y), n + 1)) (0,0,0) xs
      in
        if n mod 2 = 0 then v2 else v1
      end
    

    【讨论】:

      猜你喜欢
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2022-01-06
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多