ocaml - oCaml 中::and ' 是什么意思?

标签 ocaml

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

let rec sum xs =
  match xs with
    | [] -> 0
    | x :: xs' -> x + sum xs'

最佳答案

我认为 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
    

但是,我认为函数/值通常有一个更好的名称,所以我在编写代码时尽量避免使用 ' (我认为它不是特别可读,而且,它不在 StackOverflow 上无法正确着色!)

关于 :: 符号 - 如前所述,它用于从单个元素和列表创建列表 (1::[2; 3] 创建一个列表[1;2;3])。但值得注意的是,该符号可以以两种不同的方式使用,并且编译器也以两种不同的方式解释它。

创建列表时,您可以将其用作构造列表的运算符(就像使用 + 将两个数字相加一样)。但是,当您在 match 构造中使用它时,它被用作模式,这是一个不同的语法类别 - 该模式用于分解 em> 将列表放入一个元素和剩余部分,对于任何非空列表都会成功:

// operator
let x = 0
let xs = [1;2;3]
let list = x::xs

// pattern
match list with
| y::ys -> // ...

关于ocaml - oCaml 中::and ' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347240/

相关文章:

ocaml - 我可以使用 OCamlBuild 生成可在没有 OCaml 库的计算机上运行的 native 可执行文件吗?

arrays - OCaml 中的 "Break"for 循环

module - 为什么操作数的顺序会影响范围?

file - 在 OCaml 的父目录中创建文件?

Windows 支持 Jane Street OCaml Core?

algorithm - 用 Ocaml 中的另一个子列表替换子列表

function - 在不使用类的情况下在 OCaml 中隐藏函数参数

algorithm - OCaml 中的倒计时游戏

ocaml - 在值分析中获取数组索引变量及其值(Frama-C)

ocaml 内存在应用于斐波那契数列时失败