0

これは宿題の一部なので、私の目標はこれが間違っている理由を理解することです。前に述べたように、私はモスクワ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

(また、誰かが私に型式エラーをデコードするためのヒントを教えてくれるなら、それも非常に有益かもしれません。)

4

2 に答える 2

1

タプルとカリー化された関数呼び出しを混同しています。あなたの定義はfタプル(a、b)を要求しますが、引数を。として渡しますf a b。代わりに、への再帰呼び出しをに置き換えてみてf L ...くださいf (L,...)

タイプエラーは少し役に立ちませんが、基本的には、2タプルのリストが必要なときにリストを渡していることを示しています。

于 2010-10-24T22:01:27.087 に答える
1

(f L (e::a))fタイプがカリー化された関数である場合にのみ機能し'a list -> 'a list -> 'a listます。あなたがしているべきです:

if pred e then (f (L, (e::a))) else (f (L,a))

ところで、SMLNJは冗長な一致について不平を言っています(2つのf ([], a)句が与えられています)。

于 2010-10-24T22:01:30.383 に答える