SML 在列表中添加两对数字

SML adding two pairs of numbers in a list

我正在尝试获取一个列表,例如 [1,2,3,4],并添加列表中的每一对以获得新列表 [3,7]。我一直收到错误消息,但我不知道这意味着什么。任何帮助将不胜感激。

fun listsum x =
if null x then 0
else hd x + hd(tl x) :: listsum(tl x) + listsum(tl(tl x));

stdIn:3.6-3.58 错误:运算符和操作数不一致[过载]

 operator domain: 'Z * 'Z list
  operand:         'Z * 'Y
  in expression:
    hd x + hd (tl x) :: listsum (tl x) + listsum (tl (tl <exp>))

这里有两个问题:第一个是在最后一行,你要求两个列表的总和+;第二个是您在 if 的一个分支中返回 int,在另一个分支中返回 list

第一个问题看起来就像一个 thinko:你已经在 :: 的左侧完成了你需要的所有添加,剩下的就是递归列表的其余部分。

同时修复两者,

fun listsum x =
    if null x then []
    else hd x + hd (tl x) :: listsum (tl (tl x));

这是一个递归函数,它在列表中进行模式匹配。 listsum 在奇数长度列表上抛出异常,因为这个列表将忽略最后一个奇数值。

fun sumTwo(xs: (int) list) =
 case xs of
   h :: ht :: t  => h + ht :: sumTwo(t)
   | h :: []  => []
   | [] =>  []

测试:

- sumTwo [1,2,3];
val it = [3] : int list
- sumTwo [1,2,3,4];
val it = [3,7] : int list