SML |用if折叠

时间:2012-11-22 01:45:49

标签: syntax functional-programming sml fold

我正在进行此练习,要求计算布尔列表中有多少值为真。

我输入了这个:

fun countt xs = foldl (fn (x,y) => if x=true then y=y+1) 0 xs; 
显然,这是错误的。我收到以下错误:

stdIn:54.21-54.24 Error: syntax error: deleting  RPAREN INT0

现在,我搜索了一下,发现RPAREN是一个语法错误。但我无法弄清楚为什么首先出现问题。

2 个答案:

答案 0 :(得分:3)

在函数式编程语言中,if表达式必须同时具有branch和else分支(并且它们必须具有相同的类型)。 你的if表达式只有一个then分支。

此外,x=true始终评估为与x相同的值,因此您只需撰写if x then ... else ...

最后,看起来你正试图在then分支中编写一个赋值。请记住,foldl通过将累加器(y)重复传递给函数来工作,因为它使用xs遍历列表。因此,如果您想更新累加器,您只需返回更新的值。

答案 1 :(得分:0)

只是为了补充上一个答案,这里有建议的修改:

fun countt xs = foldl (fn (x,acc) => if x then acc+1 else acc) 0 xs;