Functional programming smlnj—在整数列表中添加偶数和奇数元素的函数

Functional programming smlnj—在整数列表中添加偶数和奇数元素的函数,functional-programming,sml,smlnj,ml,Functional Programming,Sml,Smlnj,Ml,我对函数式编程相当陌生,我不理解这里的错误。我试图创建一个函数,它接受一个整数列表,并返回偶数元素和奇数元素之和。我得到的错误在第1行,它表示:“错误:子句的右侧与函数结果类型[重载冲突]…”不一致。我不理解这个错误,如果有人能帮助我理解我的错误,我将不胜感激 fun add(nil) = 0 | add([x]) = x | add(x :: xs) = let val evenList = xs; val oddList

我对函数式编程相当陌生,我不理解这里的错误。我试图创建一个函数,它接受一个整数列表,并返回偶数元素和奇数元素之和。我得到的错误在第1行,它表示:“错误:子句的右侧与函数结果类型[重载冲突]…”不一致。我不理解这个错误,如果有人能帮助我理解我的错误,我将不胜感激

fun add(nil) = 0
|   add([x]) = x
|   add(x :: xs) =
        let
            val evenList = xs;
            val oddList = x :: xs
        in
            (hd evenList + add(tl(tl(evenList))), hd oddList + add(tl(tl(oddList))))
        end;

类型错误的原因是函数应该返回一对,但您的基本情况不返回

我怀疑你是想跳过其他元素,通过跳过来划分列表,从而得到了这段代码

有一种不同的方法来解决这个问题

考虑一下列表
[a,b,c,d]

从1开始计数,元素被编号

1 2 3 4
a b c d
现在考虑列表尾部的位置。 是的

也就是说,尾部的奇数位置在整个列表中是偶数位置,尾部的偶数位置在整个列表中是奇数位置

这意味着,如果我们递归地计算尾部的“赔率和偶数”,我们将从尾部得到总和,其中的“赔率”是我们的“偶数”,如果我们将我们的头添加到尾部的“偶数”,我们将得到我们想要的“赔率”

我们现在需要的只是一个好的基本情况——空列表的和必须是
(0,0)

大概是这样的:

fun add [] = (0,0)
  | add (x::xs) = case add xs of
                      (odds, evens) => (x + evens, odds)
或者,您可以使用
let
-绑定而不是
case
解构递归结果:

fun add [] = (0,0)
  | add (x::xs) = let val (odds, evens) = add xs
                   in
                       (x + evens, odds)
                   end

非常感谢。我想我理解你的方法,但我不熟悉案例表达。有没有一种方法可以使用if-then-else表达式来实现这种方法?@Asgore我想不出任何方法——这个问题没有任何条件。
case
用于模式匹配,因为只有一个case,所以只有一个子句。(
如果是C,那么T else E
情况C的true=>T | false=>E
相同)
fun add [] = (0,0)
  | add (x::xs) = let val (odds, evens) = add xs
                   in
                       (x + evens, odds)
                   end