1. ホーム
  2. if-statement

[解決済み] OCamlにおける複数のif文の実装

2022-02-07 06:09:05

質問

私はOCamlの初心者ですが、自分の関数が複数の条件をチェックし、それらの条件のいずれかが真である場合に変数を変更する方法を見つけようとしています。

大まかな擬似コードは以下の通りです。

var list = []
if cond1 then 1::list
if cond2 then 2::list
etc

しかし、私が知る限りでは、一度if文に入ると、関数に値を返すまでその中に留まるようです。この制限を回避する方法はあるのでしょうか?私は言語を理解するのが大好きなので、あなたの時間に感謝し、ヒントやヒントは非常に高く評価されています。

どのように解決するのですか?

OCamlの変数は不変であり、その値を変更することはできません。だから、別の方法で考える必要がある。合理的な方法としては,与えられたリストの先頭に何かを追加したものを値とする関数を用意することです.

let f list =
    if cond1 then 1 :: list
    else if cond2 then 2 :: list
    else 3 :: list

なお if OCamlでは、式、つまり値を持ちます。と似ています。 ?: C言語の影響を受けた言語における三項演算子。

このような関数を示すOCamlのセッションを紹介します。あくまで例で、これは便利な関数ではありません。

$ ocaml
        OCaml version 4.01.0

# let f list =
      if List.length list > 3 then 1 :: list
      else if List.length list > 1 then 2 :: list
      else 3 :: list ;;
val f : int list -> int list = <fun>
# f [];;
- : int list = [3]
# f [1;2];;
- : int list = [2; 1; 2]

更新情報

もし、常にifを適用したいのであれば、コードは次のようになります。

let f list =
    let list' = if cond1 then 1 :: list else list in
    let list'' = if cond2 then 2 :: list' else list' in
    let list''' = if cond3 then 3 :: list'' else list'' in
    list'''

繰り返されるパターンを独自の関数で捕捉することができます。

let f list =
    let cpfx cond pfx l = if cond then pfx :: l else l in
    cpfx cond3 3 (cpfx cond2 2 (cpfx cond1 1 list))