1

ここでの本当の基本的な質問:私はOcamlを初めて使用し、リストを操作しようとして問題が発生しています。http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.htmlを読みましたが、残念ながらまだ混乱しています。関数型プログラミングは初めてです。

たとえば、次の関数がある場合:

  let stoverfl list1 list2 list3 =
      match list1 with
      |[]->None
      |h::list1 -> (*what I want to do goes in here*)

list2とlist3の最初の要素を調べて比較し、等しい場合はlist3の最初の要素をlist2に追加します。それ以外の場合は、リストを変更しないでください。今はエラーチェック(つまり、リストに少なくとも1つの要素があるかどうかをチェックするなど)についてはあまり気にしません。

私の試み:

 h::list1 -> let cmp1 = hd list2 (*this should return the first elemnt of list2??*)
             let cmp2 = hd list3
             if(cmp1=cmp2) then
                let updlist2 = concat list2 hd list3
                let updlist3 = hd list3
                (*pass updlist2 and updlist3 instead of list2 and list3 to next function*)
             else
                (*do nothing; pass list2 and list3 as normal*)

私はそれをすべて間違っているように感じます...どんなアドバイスもいただければ幸いです!ありがとう。

4

1 に答える 1

1

list3の最初の要素をtoに追加したいとしますlist2。関数型プログラマーがこのようなことを言うとき、それが意味することは、説明されているように新しいリストを構築したいということです。実際に変更することはできませんlist2--lists は不変であり、名前は永続的に 1 つの値にバインドされます。実際、 2 つの新しいリストを作成したいようです。そのうちの 1 つは の先頭に の最初の要素がlist2ありlist3ます。もう 1 つはlist2(最初の要素を除くすべて) の残りの部分です。

これがあなたの言いたいことであり、リストが空であるかどうか心配していないと仮定すると、これらの値を取得する1つの方法は次のとおりです。

let updlist2 = List.tl list2 in
let updlist3 = (List.hd list2) :: list3

書いてある内容にかなり近いです。

しかし、次にこれらの値をどうするつもりなのだろうか。それらを別の関数に渡したい場合は、の外側letsを配置するのがより一般的です。例として、リストの最初の要素に応じて、リストまたはリストの末尾で関数を呼び出すコードを次に示します。ifg

let arg_for_g =
    match the_list with
    | [] -> []  (* No tail of the list *)
    | head :: tail -> if head = 3 then tail else the_list
in
    g arg_for_g

letの中に sを入れるifと、次の関数への 2 つの異なる呼び出しをコーディングする必要があります。それは問題ないかもしれませんが、それはあなたがあなたの価値観で何をしようとしているのかにかかっています.

(ちなみに、リストが空であるかどうかを心配する必要があります!matchステートメントを使用すると、そのケースを非常に簡単に検出できます。)

于 2013-02-01T04:31:43.093 に答える