函数定义语法

时间:2020-07-16 14:59:51

标签: ocaml

我正在尝试实现特定的算法。该算法的描述不是很好,但是我确实有OCaml实现。问题是我不知道OCaml,发现语法很奇怪。因此,这是许多问题中的第一个。对于术语错误,我们深表歉意。

我拥有的一部分代码如下:

type alternative_text = string
type indent = int

module Line =
  struct
    type t = {s:alternative_text; i:indent}
    let make s i = {s;i}
    let text (l:t): alternative_text = l.s
    let length l = String.length l.s
    let indent l = l.i
  end

我的问题与let text (l:t): alternative_text = l.s行有关。我想我知道这是什么,函数Line.text接受一个Line.t对象并返回s字段,它是一个字符串。

我的问题与(l:t): alternative_text语法有关。看起来它正在指定参数的类型和函数结果,但是为什么有必要呢?据我所知let text l = l.s会做完全相同的事情,并且在不使用此额外语法的情况下定义了其他功能。那么为什么在这里使用它呢?

谢谢。

1 个答案:

答案 0 :(得分:1)

记录的问题在于它们的字段名称的作用域超出了记录。因此,如果您有两个字段名称为a的记录,它们将发生冲突。也就是说,通常无法判断x.a是指一种记录类型还是另一种记录类型的字段。视x的类型而定。

OCaml尝试通过推断记录类型(在此示例中为x)来在此领域提供很大的灵活性。但是,如果无法推断出来,则需要指定您要谈论的类型。

作为旁注,@ glennsl是正确的。如果您需要掌握大量的OCaml,并且正在从头开始学习OCaml,那么从书本或在线教程中学习OCaml会比在StackOverflow上提出单个问题更快。

相关问题