我正在尝试实现特定的算法。该算法的描述不是很好,但是我确实有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
会做完全相同的事情,并且在不使用此额外语法的情况下定义了其他功能。那么为什么在这里使用它呢?
谢谢。
答案 0 :(得分:1)
记录的问题在于它们的字段名称的作用域超出了记录。因此,如果您有两个字段名称为a
的记录,它们将发生冲突。也就是说,通常无法判断x.a
是指一种记录类型还是另一种记录类型的字段。视x
的类型而定。
OCaml尝试通过推断记录类型(在此示例中为x
)来在此领域提供很大的灵活性。但是,如果无法推断出来,则需要指定您要谈论的类型。
作为旁注,@ glennsl是正确的。如果您需要掌握大量的OCaml,并且正在从头开始学习OCaml,那么从书本或在线教程中学习OCaml会比在StackOverflow上提出单个问题更快。