4

List.fold_left要素がリストに存在するかどうかを調べるために使用する関数をOcamlで構築するにはどうすればよいのでしょうか。例:

exists 3 [1;2;3;4;5] 
=> true

この関数のタイプは次のとおりです。a -> bool -> 'a list -> bool

それを行う方法の私の考えは次のとおりです:

let exists k l = List.fold_left( fun a x-> a=x) k l

しかし、明らかに間違っています。それを行う方法について何か提案はありますか?

4

3 に答える 3

6
let exists k l =
    List.fold_left (fun b x -> b || x = k) false l

@tonioの答えに対する2つのコメント:

  • ||不要なの代わりに使用してくださいif ... then true else ...
  • =値の比較には、参照等式( )の代わりに構造的等式( )を使用==します。

さらに、リストモジュールexistsで利用できます。組み込み関数は、リスト全体を毎回確認する必要がないため、より効率的です。

于 2012-05-02T13:14:37.470 に答える
5

あなたは次のようなものを使うべきです

let exists k l =
    List.fold_left(
      fun a x -> if x == k then true else a)
      false l
;;

の初期値がありfalse、リストを反復処理しながらそれを渡します。検索された要素が見つかったら、値をに設定しtrue、それを渡します。リスト内の要素が検索したものではない場合は、入力として持っていた値を渡します。これは、初期値であるか、false検索trueした要素がすでに見つかっている場合です。

于 2012-05-02T12:49:02.263 に答える
1

答えによって得られたヒントの後、私はそれをさらに改善することができるかもしれません。

これが私の解決策です

let exists' f l =List.fold_left(fun a b->  f b || a  ) false l;;

このように、この関数はより抽象的であり、任意の述語fに使用できます。

于 2012-05-08T00:37:48.960 に答える