#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. Если вы не знаете языка, лучший способ выучить его-это, как правило, следовать книге или учебнику. Это хорошая идея, ИМО. Переполнение стека действительно не подходит в качестве замены надлежащих учебных ресурсов.
2. Вот соответствующая страница с определениями функций: cs.cornell.edu/courses/cs3110/2019sp/textbook/basics/…
3. @glennsl Спасибо за ссылку. Я просматривал учебные пособия на веб-сайте OCaml, но эта книга, похоже, будет более полезной. Но мой вопрос остается открытым: почему типы явно указаны для
text
функции, но не для других?4. Да, я не говорю, что это неправильный вопрос, но изучение языка с помощью соответствующего ресурса может помочь сфокусировать вопрос и позволить вам больше экспериментировать с ним самостоятельно. И для протокола, я не знаю, зачем это было нужно. Кажется, так не должно быть. Может быть, это просто для того, чтобы показать другой синтаксис? Контекст, вероятно, здесь уместен.
5. Привет @джон, ссылка, которую опубликовал Гленн, отвечает на ваш вопрос.
Ответ №1:
Проблема с записями заключается в том, что их имена полей имеют область действия, выходящую за рамки записи. Таким образом , если у вас есть две записи с одинаковым именем поля a
, они столкнутся. Т. е., в целом невозможно будет определить x.a
, относится ли поле к одному типу записи или к другому типу записи. В зависимости от типа x
, это может быть либо то, либо другое.
OCaml пытается обеспечить большую гибкость в этой области, определяя тип записи ( x
в данном примере). Но если это невозможно сделать, вам нужно указать, о каком типе вы говорите.
В качестве примечания @glennsl прав. Если вам нужно разобраться в нетривиальном объеме OCaml, и вы изучаете OCaml с нуля, будет быстрее изучить OCaml из книги или онлайн-учебника, чем задавать отдельные вопросы здесь, на StackOverflow.
Комментарии:
1. Я не уверен, почему все предполагают, что, потому что я задал здесь вопрос, это единственное средство, с помощью которого я пытаюсь изучить OCaml. Я просматриваю книги и онлайн — уроки.
2. Спасибо за ответ. В этом есть смысл. Мне потребовалось бы много времени, чтобы понять это для себя (если бы я случайно не прочитал об этой конкретной проблеме в одном из учебных пособий, которые я читаю).
3. Справедливо, извините, если мы слишком подозрительны.