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