1

let _ as s = "abc" in s ^ "def"

では、これをどのように理解すればよいのでしょうか。


ひょっとして、何かあるのかlet pattern = expressionな?

まず、 の意味/目的/論理はlet pattern = expression何ですか?

また、 では使い方pattern matchingがあることは知っていますが、 ではパターンですが、後ろではではなく式ですよね?pattern as identifierlet _ as s = "abc" in s ^ "def"_ass = "abc" in s ^ "def"identifier

編集

最後に、これはどうですか: (fun (1 | 2) as i -> i + 1) 2、これは正しいですか?

それが間違っていることはわかっていますが、なぜですか?fun pattern -> expression許可されていますよね?


ここで本当に迷いました。

4

2 に答える 2

5

グループ化はlet (_ as s) = "abc"- の複雑な言い方です。前let s = "abc"asワイルドカード パターン_を使用してもほとんど役に立たないからです。

于 2012-12-12T23:27:59.780 に答える
4

let pattern = expr1 in expr2は OCaml の中心です。パターンが単なる名前の場合は、式に名前を付けることができます。これは、他の言語のローカル変数のようなものです。パターンがより複雑な場合は、expr1を分解できます。つまり、そのコンポーネントに名前を付けることができます。

あなたの式では、 behindasは単なる識別子です: s. あなたの混乱はすべて、この 1 つのことに帰着するのではないかと思います。式は次のように括弧で囲むことができます。

let (_ as s) = "abc" in s ^ "def"

アンドレアス・ロスバーグが示すように。

括弧をいくつか追加すると、最後の例は正しいです。コンパイラ/トップレベルは、関数が部分的であると正しく不平を言います。つまり、1 と 2 のみで、ほとんどの int をどう処理するかがわかりません。

編集:これは、最後の例に括弧を追加する方法を示すセッションです:

$ ocaml
        OCaml version 4.00.0

# (fun (1 | 2) as i -> i + 1) 2;;
Error: Syntax error
# (fun ((1 | 2) as i) -> i + 1) 2;;
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
0
- : int = 3
#

編集 2 : これは、パターンの完全なセットを指定して警告を削除する方法を示すセッションです。

$ ocaml
        OCaml version 4.00.0

# (function ((1|2) as i) -> i + 1 | _ -> -1) 2;;
- : int = 3
# (function ((1|2) as i) -> i + 1 | _ -> -1) 3;;
- : int = -1
# 
于 2012-12-12T23:38:15.247 に答える