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