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
,对吗?
我真的迷路了。
答案 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
#