ML anonymous function alternating sum

最后都变了- 提交于 2019-12-12 03:17:23

问题


For my homework assignment in ML I have to use the fold function and an anonymous function to turn a list of integers into the alternating sum. If the list is empty, the result is 0. This is what I have so far. I think what I have is correct, but my biggest problem is I cannot figure out how to write what I have as an anonymous function. Any help would be greatly appreciated.

    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];

These are just some examples that I tested to see if what I had worked and I think all three are correct.


回答1:


There are two cases: one when the list length is even and one when the list length is odd. If we have a list [a,b,c,d,e] then the alternating sum is a - b + c - d + e. You can re-write this as

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

If the list has an even length, for example [a,b,c,d] then we can write its alternating sum as

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

So to address these two cases, we can have our accumulator for fold be a 3-tuple, where the first entry is the correct value if the list is odd, the second entry is the correct value if the list is even, and the third value tells us the number of elements we've looked at, which we can use to know at the end if the answer is the first or second entry.

So an anonymous function like

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

will work, and we can use it with foldl with a starting accumulator of (0,0,0), so

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


来源:https://stackoverflow.com/questions/26677750/ml-anonymous-function-alternating-sum

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!