4

定数値の代わりに変数でパターンマッチングを行うことは可能ですか?

# let x = 2 in
let y = 5 in
match 2 with
| x -> "foo"
| y -> "bar"
| _ -> "baz";;
            let y = 5 in
Warning 26: unused variable y.
  let x = 2 in
Warning 26: unused variable x.
  | y -> "bar"
Warning 11: this match case is unused.
  | _ -> "baz";;
Warning 11: this match case is unused.
- : string = "foo"

明らかに、この構文では、x -> "foo"ケースがすべてを取ります。それを以下と同等にする方法はありますか?

match 2 with
| 2 -> "foo"
| 5 -> "bar"
| _ -> "baz"

一致式の値は実行時に決定されますか?

4

3 に答える 3

6

私のwhen意見では、警備員は悪い考えです。初心者は、便利だと思うパターンマッチング構文を使いすぎる傾向があり、その結果、アプリケーションに微妙なバグが発生します。「ねえ、| y -> ..これは私が欲しいものではない」と気付く一人の人にとって、他の10人は間違いを犯し、直接気づかないでしょう。

このようなエラーが発生しやすいパターンはお勧めできません。初心者への私の個人的なアドバイスは、を使用せず、パターンマッチングのみを使用して、帰納的データ型(リスト、ツリー、オプションなど)の値を非構造化することです。整数のパターンマッチングは、ほとんどの場合間違いです。when

代わりに使用することをお勧めしますif ... then .. else if .. then .. else

if z = x then "foo"
else if z = y then "bar"
else "baz"

いつ使用するのが合法whenですか?残りのケースがパターンマッチングの恩恵を受ける場合(ネストされたパターンなどをテストする場合)、または一致した値の深い破壊から生じる値に対してテストが実行される場合は、1つあることは理解できます。if..then..else多くの場合、2つのブランチをマージし、ローカルで使用することで変換できます。

削除するのが不便な例の1つは、次のとおりです(テストと破壊の組み合わせ)。

match foo with
| (Baz x) when pred x -> ...
| _ -> ... 
于 2012-05-04T11:22:20.250 に答える
5

when警備が必要です:

let x = 2 in
let y = 5 in
match 2 with
| z when z = x -> "foo"
| z when z = y -> "bar"
| _ -> "baz";;

エラーメッセージは非常に有益です。使用する場合:

let x = 2 in
...
match 2 with
| x -> "foo"
| ...

新しい値は、以前のlet-boundxの値をシャドウしているため、最初のエラーメッセージが表示されます。xさらに、新しいxものはすべてに一致するため、以下の2つのパターンy_は明らかに冗長です。

定数(match 2 with)を一致させることはお勧めできません。

于 2012-05-03T16:39:55.007 に答える
3

「いつ」の警備員はあなたがここで探しているものです:

let x = 2 in
let y = 5 in
match 2 with
| x' when x' = x -> "foo"
| y' when y' = y -> "baz"
| _ -> "baz" ;;

...なぜ定数と一致させたいのかはわかりませんが。

于 2012-05-03T16:42:26.633 に答える