2012-05-02 9 views
4

OcamlでList.fold_leftを使って要素がリストに存在するかどうかを調べるにはどうすればいいのでしょうか? 例: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 

しかし、明らかに間違っています。どのようにそれを行うにはどのような提案?

+0

私は '' a - > 'a list - > bool'を 'exits'関数の型として使っていると思います。 – tonio

答えて

1

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

が私の解決策は、このよう

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

で、この機能は、より抽象的であり、任意の述語Fのために使用することができます。

5

あなたはfalseの初期値を持っており、リストを反復処理しながら、それを渡す

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

のようなものを使用する必要があります。検索した要素が見つかったら、値をtrueに設定し、それを渡します。リスト内の要素が検索対象でない場合は、入力した値を渡します。検索する要素がすでに見つかっている場合は、最初はfalse、またはtrueのいずれかです。

+0

私の問題はそれでした!私はどのようにブール値に影響を与える方法を意味する、合計を行うには簡単ですが、我々は合計と合計などが必要です...この場合、私は影響を受けることができる変数のように動作することがわかります。お返事ありがとう –

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

の@トニオの答え上の2件のコメント:

  • 利用||の代わりに、余分if ... then true else ...
  • 値を比較するために参照等価(==)の代わりに構造式(=)を使用します。

また、existsList moduleで利用可能です。組み込み関数は、毎回リスト全体を処理する必要がないため、より効率的です。

+0

ありがとうございます。目的はリストイテレータを学ぶことです。 List.existsはすでに開発済みです。 –

+1

'(fun b x - > b || x = k)'と書くと、最初に見つかった要素の後で '='をスキップすることができます。それはおそらく違いはありません – newacct

関連する問題