x :: xs'
是什么意思?
我没有太多的功能经验,但在F#1 :: 2 :: 3 :: [];;创建一个[1,2,3]数组
那么'做什么?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
答案 0 :(得分:15)
我认为 sepp2k 已经回答了大部分问题,但我想补充几点,可以澄清F#/ OCaml编译器如何解释代码并解释一些常见用法。
关于'
符号 - 这只是名称的一部分(有效的标识符以字母开头,然后包含一个或多个字母,数字或'
符号)。如果您的函数或值与其他函数或值非常相似,但通常以某种方式 new 或 modified ,则通常会使用它。
在您的示例中,xs
是一个应该求和的列表,模式匹配会分解列表并为您提供需要求和的新列表(没有第一个元素),因此它是名为xs'
另一个常见的用法是声明一个实现该功能的本地实用程序函数并获取一个额外的参数(通常,在编写尾递归代码时):
let sum list =
let rec sum' list res =
match list with
| [] -> res
| x::xs -> sum' xs (res + x)
sum' list 0
但是,我认为函数/值通常有更好的名称,所以我在编写代码时尽量避免使用'
(我认为它不是特别易读,而且它不会着色正确地在StackOverflow上!)
关于::
符号 - 如前所述,它用于从单个元素和列表创建列表(1::[2;3]
创建列表[1;2;3]
)。然而值得注意的是,符号可以以两种不同的方式使用,编译器也可以通过两种不同的方式对其进行解释。
创建列表时,可以将其用作构造列表的运算符(就像使用+
添加两个数字一样)。但是,当您在match
构造中使用它时,它将用作模式,这是一个不同的语法类别 - 该模式用于分解列出一个元素和剩余部分,并且它对任何非空列表都成功:
// operator
let x = 0
let xs = [1;2;3]
let list = x::xs
// pattern
match list with
| y::ys -> // ...
答案 1 :(得分:6)
'只是变量名的一部分。是的foo :: bar
,其中foo是a类型的元素,bar是a类型的列表,意思是“将foo作为其第一个元素的列表,后跟bar的元素”。所以匹配语句的含义是:
如果xs是空列表,则值为0.如果xs是包含项目x的列表,后跟xs'
中的项目,则值为x + sum xs'
。由于x
和xs'
是新变量,因此对于任何非空列表,都会为x
分配第一个元素的值,并为xs'
分配包含所有其他元素的列表。
答案 2 :(得分:2)
就像其他人所说的那样,'是数学的延续,其中x'将被称为“x prime”
答案 3 :(得分:1)
在ML系列语言中,用一个变量foo'
来表示它与另一个变量foo
有些相关,尤其是在代码示例等递归中,这是惯用的。就像命令式语言一样,您使用i
,j
作为循环索引。这个命名约定可能有点令人惊讶,因为'
通常是C语言中标识符的非法符号。
答案 4 :(得分:0)
x :: xs'
是什么意思?
如果您有两个名为x
和xs'
的变量,则x :: xs'
会在x
的前面创建一个xs'
的新列表。
我没有太多的功能经验,但是在F#1 :: 2 :: 3 :: [];;创建一个[1,2,3]
的数组
不完全。这是一个清单。
那么'做什么?
它被视为按字母顺序排列的字符,因此以下内容相同:
let rec sum xs =
match xs with
| [] -> 0
| x :: ys -> x + sum ys
请注意,::
在技术上是一个类型构造函数,这就是为什么你可以在模式和表达式中使用它。