これは宿題の一部なので、私の目標はこれが間違っている理由を理解することです。前に述べたように、私はモスクワMLを使用しています。
fun filter pred = let
fun f ([], a) = []
| f ([], a) = a
| f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)
in
f
end
私が得るエラーは次のとおりです。
| f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)
^
Type clash: expression of type
'a list cannot have type
'a list * 'b list
私はドキュメントを読んでいますが、それは本当に役に立ちませんでした。私が本当に得られないのは、'bリストがどこから来ているかです。私たちの割り当てでは、末尾再帰のあるアキュムレータを使用する必要があります。私のエラーは、フィルターが関数fを呼び出す方法だと思います。Filterは述語を引数として取り、fは最初は空のリストであるリストとアキュムレータを取ります。
私はfを次のように呼び出してみました:f L []、しかし他の例では、実際に引数を使ってfを呼び出す必要はなく、どういうわけか自動的に渡されました。
とにかく、私の間違いがどこにあるのかを理解する助けと、問題を解決する方法についてのガイダンスをいただければ幸いです。
-aitee
(また、誰かが私に型式エラーをデコードするためのヒントを教えてくれるなら、それも非常に有益かもしれません。)