我有這個練習,要求計算布爾列表中有多少個值爲真。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是一個語法錯誤。但我不明白爲什麼有一個問題擺在首位。
我有這個練習,要求計算布爾列表中有多少個值爲真。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是一個語法錯誤。但我不明白爲什麼有一個問題擺在首位。
在函數式編程語言中,if表達式必須同時具有分支和其他分支(並且它們必須具有相同的類型)。 你的if表達式只有一個then分支。
此外,x=true
始終計算爲與x
相同的值,因此您只需編寫if x then ... else ...
即可。
最後,它看起來像你正試圖在當時的分支寫作業。請記住,foldl通過將累加器(y
)重複傳遞給該函數,因爲它將以xs
遍歷列表。所以如果你想更新累加器,你所要做的就是返回更新的值。
非常感謝您對這兩個if表達式和累加器的混亂! (我不知道這是不是希臘語翻譯,但韋伯的書不是特別有洞察力的...... – persongr
只是爲了在這裏補充以前的答案是建議修改:
fun countt xs = foldl (fn (x,acc) => if x then acc+1 else acc) 0 xs;
這是功課?我認爲它是。 – Lambdageek
是的,它來自Webber的Modern Programming Languages書。 – persongr