2012-03-09 13 views
2

ocamlには新しくなっています。ocamlリストからの条件文による繰り返し

私は、リストをとり、奇数の整数だけを持つ新しいリストを返す関数を書いてみたいです。

リストを反復するだけで、おそらく%2を使って奇数の整数を見つけ、それらを新しいリストに追加することができます。

ocamlには新しく、map、rev-map、iter、または場合によってはフィルタリングのような有用なものを見てきましたか?

どのようなものを使用するのが最適でしょうか、どのように設定しますか?

答えて

5

List moduleで最も適しています。その署名と説明を見:

val filter : ('a -> bool) -> 'a list -> 'a list 

フィルタP Lが 述語pを満たすリストLの全ての要素を返します。入力リスト内の要素の順序は保持されます。

質問に明記されているように、奇数の整数をチェックするための述語を指定する方法を知っておく必要があります。

もうあまりエレガントな解決策は以下のとおりです。

  • 単にリストを反復し、結果を収集するために、アキュムレータのリストを使用します。
  • 要素が奇数の場合は、その要素をアキュムレータの前に付加します。
  • アキュムレータを逆にして正しい順序を取得します。

このソリューションは、リストを反転させる結果とList.revを蓄積するList.fold_leftに関与。

あなたはどの機能が適切かを尋ねるだけなので、うまくいけばあなた自身でそれらを使用することができます。

EDIT:

あなたがList.filterであなたの試みを共有しているので、ここでそれを使用する1つの方法です:

let odds xs = List.filter (fun x -> x mod 2 <> 0) xs 

のOCamlでさらに得ることができるようにするには、読むためにいくつかの時間がかかるしてくださいOCamlチュートリアル。 OCaml tag wikiには、始めにかなりの数の優れたリソースがあります。

+0

ありがとうございました。もちろん、私はブラウズすることができ、おそらく機能が最も良くなるかどうかを推測することができますが、構文を理解するのは難しいです。 私はフィルタを使用した場合、私は何を考えていることのようなものになります。 せoddfuncマイリスト= List.filter(マイリストX - > [場合は、その後、 をリストに追加{X%2 = 0を!}あなたが見ることができるように、私はocaml構文の理解が非常に乏しく、ほとんど私の擬似的な考えを書き留めています。 –

+0

@JohnRedyns:私の更新された答えを見てください。 – pad

+0

引用符で囲まれたタイプは、あなたが知る必要があることを伝えます。 'List.filter'は関数とリストをとり、別のリストを返します。この関数は、要素を結果に表示するかどうかを指定します。したがって、次に必要なのは、数値が奇数であれば 'true'を返す関数です。それはどんな 'int'でも動作するはずです。' mylist'について何も知っている必要はありません。 –

関連する問題