Синтаксис определения функции

#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. Справедливо, извините, если мы слишком подозрительны.