1

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

那么这个应该怎么理解呢?


我想这是某种let pattern = expression东西?

首先, 的含义/目的/逻辑是let pattern = expression什么?

另外,在pattern matching,我知道有pattern as identifier用法,在let _ as s = "abc" in s ^ "def"_是模式,但在后面as,它是一个表达式s = "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,即,它可以让您为其组件命名。

在你的表达中,后面as只是一个标识符:s。我怀疑你的困惑都归结为这一件事。表达式可以用括号括起来:

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

正如安德烈亚斯罗斯伯格所展示的那样。

如果您添加一些括号,您的最后一个示例是正确的。编译器/顶层正确地抱怨你的函数是部分的;即,它不知道如何处理大多数整数,只知道 1 和 2。

编辑:这是一个展示如何将括号添加到最后一个示例的会话:

$ 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 回答