【问题标题】:SML| foldl with ifSML|用 if 折叠
【发布时间】:2012-11-10 09:13:26
【问题描述】:

我正在做这个练习,要求计算布尔列表中有多少值为真。

我输入了这个:

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 是一个语法错误。但我不明白为什么首先会出现问题。

【问题讨论】:

  • 这是作业吗?我认为是的。
  • 是的,它来自韦伯的《现代编程语言》一书。

标签: syntax functional-programming sml fold


【解决方案1】:

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

此外,x=true 的计算结果始终与x 相同,因此您只需编写if x then ... else ...

最后,您似乎正在尝试在 then 分支中编写作业。请记住,foldl 在使用xs 遍历列表时,通过重复将累加器 (y) 传递给函数来工作。所以如果你想更新累加器,你所要做的就是返回更新后的值。

【讨论】:

  • 感谢有关 if 表达式和累加器混乱的提示! (我不知道这是否只是希腊翻译,但韦伯的书并不是特别有见地......
【解决方案2】:

为了补充前面的答案,这里建议修改:

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

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2017-01-30
    • 1970-01-01
    • 2013-12-25
    • 2016-05-10
    • 2012-08-17
    • 1970-01-01
    • 2016-08-30
    • 2012-07-15
    相关资源
    最近更新 更多