2012-11-22 50 views
1

我有這個練習,要求計算布爾列表中有多少個值爲真。SML | foldl with if

我輸入這樣的:

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是一個語法錯誤。但我不明白爲什麼有一個問題擺在首位。

+0

這是功課?我認爲它是。 – Lambdageek

+0

是的,它來自Webber的Modern Programming Languages書。 – persongr

回答

3

在函數式編程語言中,if表達式必須同時具有分支和其他分支(並且它們必須具有相同的類型)。 你的if表達式只有一個then分支。

此外,x=true始終計算爲與x相同的值,因此您只需編寫if x then ... else ...即可。

最後,它看起來像你正試圖在當時的分支寫作業。請記住,foldl通過將累加器(y)重複傳遞給該函數,因爲它將以xs遍歷列表。所以如果你想更新累加器,你所要做的就是返回更新的值。

+0

非常感謝您對這兩個if表達式和累加器的混亂! (我不知道這是不是希臘語翻譯,但韋伯的書不是特別有洞察力的...... – persongr

0

只是爲了在這裏補充以前的答案是建議修改:

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