Здравствуйте, VladD2, Вы писали:
VD>Разве необходимость объявлять типы перед тем как они используются — это придумка F#-а? Я в ОКамле не силен, но что-то мне казалось, что это из него пошло.
Необходимость объявлять есть, но также есть возможность предварительного (неконкретизированного) объявления типов и сигнатур функций. Для этого есть .mli файлы во многом аналог сишных заголовочных файлов.
Например в .mli такое объявление:
type command
val command: ?doc:string -> string -> Arg.spec -> command
в .ml конкретизация:
type command =
{ doc : string(**The documentation associated to the keyword, possibly empty.*);
kwd : string(**The keyword. Should start with "-"*);
spec : Arg.spec (**The behavior associated to the keyword*);
}
let command ?(doc="") kwd spec =
{ doc = doc;
kwd = kwd;
spec= spec }
VD>В прочем, может быть это проблемы расширения алгоритма вывода типов сделанного в F#.
VD>Что до модулей, то в F# модуль — это сборка. А сборки в дотнете сильно боше чем модули (юниты) в других языках. И вот в их рамках F# обязывает располагать типы последовательно. А так как он позволяет их разносить по отдельным файлам, то требуют располагать файлы в определенной последовательности.
В OCaml подобная заморочка есть только у линкера, в исходном же коде можно произвольно располагать.