在oCaml中::和'是什么意思?

7 ocaml

什么x :: xs'意思?我没有太多的功能经验,但在F#1 :: 2 :: 3 :: [];; 创建一个[1,2,3]的数组,那么'做什么?

let rec sum xs =
  match xs with
    | [] -> 0
    | x :: xs' -> x + sum xs'
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 16

我认为sepp2k已经回答了大部分问题,但我想补充几点,可以澄清F#/ OCaml编译器如何解释代码并解释一些常见用法.

关于'符号 - 这只是名称的一部分(有效的标识符以字母开头,然后包含一个或多个字母,数字或'符号).如果您的函数或值与其他函数或值非常相似,但通常是新的修改的,则通常使用它.

  • 在您的示例中,xs是一个应该求和的列表,模式匹配会分解列表并为您提供需要求和的新列表(没有第一个元素),因此调用它xs'

  • 另一个常见的用途是声明一个实现该功能的本地实用程序函数并获取一个额外的参数(通常,在编写尾递归代码时):

    let sum list =
      let rec sum' list res = 
        match list with
        | [] -> res
        | x::xs -> sum' xs (res + x)
      sum' list 0
    
    Run Code Online (Sandbox Code Playgroud)

但是,我认为函数/值通常有一个更好的名称,所以我尽量避免'在编写代码时使用(我认为它不是特别易读,而且它在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 -> // ...
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 6

'只是变量名的一部分.是的foo :: bar,其中foo是a类型的元素,bar是a类型的列表,意思是"将foo作为其第一个元素的列表,后跟bar的元素".所以匹配语句的含义是:

如果xs是空列表,则值为0.如果xs是包含项x的列表,则后跟xs'值中的项x + sum xs'.由于xxs'是新变量,因此对于任何非空列表,x将分配第一个元素的值,xs'并将为其分配包含所有其他元素的列表.

  • '只是名字中允许的另一个角色.余数和余数之间没有差别,除了最后一个发音为"余数素数". (2认同)