Я часто использую F #. Все базовые коллекции в F # реализуют интерфейс IEumberable, поэтому вполне естественно получить к ним доступ, используя единственный модуль Seq
в F #. Возможно ли это в OCaml?
Другой вопрос заключается в том, что 'a seq
в F # ленив, например. Я могу создать последовательность от 1
до 100
, используя {1..100}
или более подробно:
seq { for i=1 to 100 do yield i }
В OCaml я использую следующие два метода, чтобы обойти эту функцию:
создать список:
let rec range a b =
if a > b then []
else a :: range (a+1) b;;
или прибегнуть к явным рекурсивным функциям.
Первый генерирует дополнительные списки. Вторая нарушает абстракцию, так как мне нужно работать на уровне последовательности, используя функции более высокого порядка, такие как map
и fold
.
Я знаю, что библиотека OCaml имеет модуль Stream . Но его функциональность кажется довольно ограниченной, а не такой общей, как 'a seq
в F #.
Кстати, я играю в Project Euler недавно с использованием OCaml. Таким образом, существует довольно много последовательностей операций, которые в императивном языке были бы циклами со сложным телом.