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。