14

「プログラミング F#」では、次のようなパターン マッチングに出くわしました (少し単純化しました)。

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

実際には、最後の一致がリストの先頭と末尾を認識することを理解しています。概念的には、なぜそれが機能するのかわかりません。私が理解している限り、 :: はリストの先頭に値を追加する cons 演算子ですが、ここで演算子として使用されているようには見えません。これをリストの「特別な構文」と理解する必要があります。 :: はコンテキストに応じて演算子または「一致パターン」として解釈されますか? それとも、他の演算子を使用して、同じ考えをリスト以外の型に拡張できますか?

4

3 に答える 3

14

リストの特殊な構文です。list次のように、型を判別共用体と考えることができます。

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

Nilbe[]Cons(h,t)beを作る特別な構文があることを除いてh::t。次に、判別共用体での通常のパターン マッチングです。それは役に立ちますか?

(このブログエントリも参照してください。)

于 2010-05-17T04:17:37.363 に答える
12

ブライアンの答えに加えて、注目に値するいくつかのポイントがあります。構文は、演算子とパターンh::tの両方として使用できます。

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

これは、他の演算子(たとえば+)をパターンとして使用できないため(結果を演算子の引数に分解するため)、少し特殊な構成であることを意味します-明らかに+、これはあいまいになります。

また、[_]ネストされたパターンの例であるため、パターンは興味深いものです。それは構成します:

  • _-任意の値に一致し、記号をバインドしないアンダースコアパターン
  • [ <pattern> ]-単一要素のリストパターン。単一要素のリストと一致し、ネストされたのリストの要素と一致します<pattern>

match 1::[] with | [x] -> x単一の要素(この場合は1)の値を返すwhichを記述することもできます。

于 2010-05-17T13:23:01.617 に答える
5

フォーマッタとして、または正式に使用されます。`list pattern' は次の 3 つのパターンに一致します。

[] はリストが空であることを意味します

[_] は、要素が何であるかを気にしないため、リストに 1 つの要素があることを意味します。単純にそこに _ を入力すると、[a] も使用できます。

head::tail は、リストに head と tail の 2 つの部分があることを意味します。

F# のパターン マッチングは、強力な if then else 構造と見なすことができます。

于 2010-05-17T04:18:49.140 に答える