Functional programming 我应该如何理解“let”作为s=”;abc";在s^“中;def";`用OCaml?
Functional programming 我应该如何理解“let”作为s=”;abc";在s^“中;def";`用OCaml?,functional-programming,ocaml,Functional Programming,Ocaml,s^“def”中的s=“abc” 那么我们应该如何理解这一点呢? 我猜这是某种let pattern=expression的东西 首先,let pattern=expression的含义/目的/逻辑是什么 同样,在模式匹配中,我知道有模式作为标识符的用法,在中,让s^“def”中的s=“abc”是模式,但在as后面,它是s^“def”中的一个表达式,而不是标识符,对吗 编辑: 最后,这个怎么样:(乐趣(1 | 2)作为i->i+1)2,对吗 我知道这是错误的,但为什么呢趣味模式->表达是允许的
s^“def”中的s=“abc”
那么我们应该如何理解这一点呢?
我猜这是某种
let pattern=expression
的东西
首先,let pattern=expression
的含义/目的/逻辑是什么
同样,在模式匹配
中,我知道有模式作为标识符
的用法,在中,让s^“def”
中的s=“abc”是模式,但在as
后面,它是s^“def”中的一个表达式,而不是标识符
,对吗
编辑:
最后,这个怎么样:(乐趣(1 | 2)作为i->i+1)2
,对吗
我知道这是错误的,但为什么呢<代码>趣味模式->表达是允许的,对吗
我在这里真的迷路了。分组是
let(\uAS s)=“abc”
——这只是说let s=“abc”
,因为前面带有通配符模式的as
几乎没有用。分组是let(\uAS s)=“abc”
--这只是一种复杂的说法,因为前面带有通配符模式的as几乎没有用处。expr2中的表达式let pattern=expr1对于OCaml来说非常重要。如果模式只是一个名称,那么它允许您命名表达式。这类似于其他语言中的局部变量。如果模式更复杂,它允许您对expr1进行分解,也就是说,它允许您为其组件命名
在表达式中,as
后面只是一个标识符:s
。我怀疑你的困惑都归结于一件事。表达式可以用括号括起来,如下所示:
let (_ as s) = "abc" in s ^ "def"
正如安德烈亚斯·罗斯伯格所显示的那样
如果添加一些括号,则最后一个示例是正确的。编译器/顶层正确地抱怨您的函数是局部的;i、 例如,它不知道如何处理大多数INT,
只有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
#
expr2
中的表达式let pattern=expr1对于OCaml非常重要。如果模式只是一个名称,那么它允许您命名表达式。这类似于其他语言中的局部变量。如果模式更复杂,它允许您对expr1进行分解,也就是说,它允许您为其组件命名
在表达式中,as
后面只是一个标识符:s
。我怀疑你的困惑都归结于一件事。表达式可以用括号括起来,如下所示:
let (_ as s) = "abc" in s ^ "def"
正如安德烈亚斯·罗斯伯格所显示的那样
如果添加一些括号,则最后一个示例是正确的。编译器/顶层正确地抱怨您的函数是局部的;i、 例如,它不知道如何处理大多数INT,
只有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
#
在我的最后一个例子中,(1 | 2)作为我的
应该有优先权,对吗?拥有一个OCaml标准会很好,但现在我要说编译器是该语言的权威!在parser.y
中,您将看到minusbeverter
的优先级高于AS
。所以括号是必需的。好的,那么如何使(有趣((1 | 2)as i)->i+1)2代码>正确吗?我能写(乐趣((1 | 2)如同我)->I+1 | | u->-1)2
?只需添加其他案例fun
只需一种模式即可。您可以将功能
用于多种模式。请参见编辑2。在我的最后一个示例中,(1 | 2)因为我
应该有优先权,对吗?拥有一个OCaml标准会很好,但现在我要说编译器是该语言的权威!在parser.y
中,您将看到minusbeverter
的优先级高于AS
。所以括号是必需的。好的,那么如何使(有趣((1 | 2)as i)->i+1)2代码>正确吗?我能写(乐趣((1 | 2)如同我)->I+1 | | u->-1)2
?只需添加其他案例fun
只需一种模式即可。您可以将功能
用于多种模式。见编辑2。