SML在列表中添加两对数字

时间:2015-03-10 21:14:42

标签: sml smlnj

我试图获取一个列表,例如[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));

标准: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>))

2 个答案:

答案 0 :(得分:0)

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

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

修复两者,

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

答案 1 :(得分:0)

这是一个模式匹配列表的递归函数。 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