0

そのため、入力リストの各要素に指定された述語に適用され、出力に含める必要があるかどうかをチェックする関数「フィルター」を作成しました。

let rec filer (pred: 'a -> bool) (l: 'a list) : 'a list =
begin match l with
| [] -> []
| hd :: rest -> if (pred hd) then hd :: (filter pred rest) else filter pred rest
end

今、フィルターに渡して 5 の倍数だけを保持できる述語を作成しています。

let multiples_of_five_pred: int -> bool =
filter (fun (x: int) -> x mod 5)

ここで何が欠けているのかわかりません...「この式には int 型がありますが、bool 型が期待されていました」という構文エラーが表示されます。

4

2 に答える 2

2

に指定された関数filterはブール値を生成する必要がありますが、エラー メッセージが示すように、指定した関数filterはブール値ではなく整数を生成します。代わりにブール値を生成するように変更する必要があります。

それを修正すると、別の型エラーが発生します。filter整数を取る関数に適用すると、 type の関数が生成int list -> int listされますが、型シグネチャによると、 type が必要ですint -> bool

また、それは に与えられる関数multiples_of_five_prodであるべきだと言っていますが、実際には関数内で呼び出していることに注意してください。それは合いません。への呼び出しを削除する必要があります。filterfilterfilter

于 2013-02-09T19:20:33.003 に答える
0

問題の根本は、必要のないときに型注釈を使用していることです。それらを見逃した場合 (それらは必要ありません)、2 番目の関数が期待する型を持たない理由がすぐにわかります。

于 2013-02-09T17:01:05.067 に答える