我应该如何理解在OCaml中的'^ _ as s =“abc”在s ^“def”中?

时间:2012-12-12 23:20:44

标签: functional-programming ocaml

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是模式,但在{{1}之后它是一个表达式s = "abc" in s ^ "def",而不是identifier,对吗?

修改

终于,这个怎么样:(fun (1 | 2) as i -> i + 1) 2,这是对的吗?

我知道这是错的,但为什么呢?允许fun pattern -> expression,对吗?


我真的迷路了。

2 个答案:

答案 0 :(得分:5)

分组为let (_ as s) = "abc" - 这只是说let s = "abc"的一种错综复杂的方式,因为前面带有通配符模式as的{​​{1}}几乎没用。< / p>

答案 1 :(得分:4)

表达式let pattern = expr1 in expr2是OCaml的核心。如果模式只是一个名称,它可以让您命名一个表达式。这就像是其他语言的局部变量。如果模式更复杂,它可以让你解构expr1,即,它允许你给它的组件命名。

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

let (_ as s) = "abc" in s ^ "def"
正如安德烈亚斯罗斯伯格所说的那样。

如果添加一些括号,最后的示例是正确的。编译器/ toplevel正确地抱怨你的功能是偏的;也就是说,它不知道如何处理大多数的整数, 只有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
#