我正在尝试实现一个特定的算法。该算法没有很好地描述,但我确实有一个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
会做完全相同的事情,并且其他函数都是在不使用这种额外语法的情况下定义的。那么,为什么要在这里使用它呢?
提前谢谢。
记录的问题是它们的字段名的作用域在记录之外。因此,如果您有两个字段名为a
的记录,它们将发生冲突。也就是说,通常不可能判断x.a
是指一种记录类型中的字段还是指另一种记录类别中的字段。根据x
的类型,它可以是任意一种。
OCaml试图通过推断记录类型(在本例中为x
(来在这一领域提供很大的灵活性。但如果无法推断,则需要指定您所说的类型。
顺便说一句,@glensl是正确的。如果你有大量的OCaml需要弄清楚,并且你正在从头开始学习OCaml,那么从书或在线教程中学习OCaml将比在StackOverflow上提出单独的问题更快。