1

だから私は、フィルタリングを実行する折り畳みのための結合関数を書いています。

let filter_combine (pred: 'a -> bool) : a' list -> 'a list -> 'a list =
fun (x: 'a) (y: 'a list) -> x :: (filter pred y)

コンパイルの問題はありませんが、2 つのテスト ケースのうち 1 つが失敗しています。実装の何が問題になっていますか?

これは失敗するテストケースです...

[-1; 1] = fold (filter_combine (fun (x: int) -> (abs x) mod 2 <> 0)) [] [-2; -1; 0; 1; 2]

これは機能するものです...

[-2; 2] = fold (filter_combine (fun (x: int) -> (abs x) > 1)) [] [-2; -1; 0; 1; 2]
4

1 に答える 1

1

この質問を理解するのに苦労しています。あなたが言っているのは、述語を取り、フォールドでの使用に適した関数を返す関数を作成して、結果が述語に従ってフィルタリングされるようにしたいということだと思います。

質問に関するいくつかの問題:

  • という名前の組み込み OCaml 関数はありませんfold

  • フィルタリングを実装することになっている場合、実装で使用するのはかなり奇妙に思えfilterます。

を使用していると仮定するとfold_right、タイプ の関数を返したいと思われますa -> a list -> a list。物事のリスト全体ではなく、何をすべきかを決定するために 1 つのことを見たいと考えています。コンパイルエラーが発生していないと言うので、これは、指定された関数foldが期待どおりに機能しないことを示唆しています。fold実際にどのように機能するかを示していただけると助かります。

于 2013-02-09T20:46:25.423 に答える