IEnumerable <T>в OCaml - PullRequest
       47

IEnumerable <T>в OCaml

6 голосов
/ 06 июля 2011

Я часто использую F #. Все базовые коллекции в F # реализуют интерфейс IEumberable, поэтому вполне естественно получить к ним доступ, используя единственный модуль Seq в F #. Возможно ли это в OCaml?

Другой вопрос заключается в том, что 'a seq в F # ленив, например. Я могу создать последовательность от 1 до 100, используя {1..100} или более подробно:

seq { for i=1 to 100 do yield i }

В OCaml я использую следующие два метода, чтобы обойти эту функцию:

  1. создать список:

    let rec range a b = 
      if a > b then []
      else a :: range (a+1) b;;
    
  2. или прибегнуть к явным рекурсивным функциям.

Первый генерирует дополнительные списки. Вторая нарушает абстракцию, так как мне нужно работать на уровне последовательности, используя функции более высокого порядка, такие как map и fold.

Я знаю, что библиотека OCaml имеет модуль Stream . Но его функциональность кажется довольно ограниченной, а не такой общей, как 'a seq в F #.

Кстати, я играю в Project Euler недавно с использованием OCaml. Таким образом, существует довольно много последовательностей операций, которые в императивном языке были бы циклами со сложным телом.

Ответы [ 4 ]

5 голосов
/ 06 июля 2011

Эта библиотека Ocaml предлагает то, что вы просите.Я не использовал его, хотя.

http://batteries.forge.ocamlcore.org/

Оформить заказ на этот модуль, Enum http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Enum.html

Мне почему-то кажется, что Enum - гораздо лучшее имя, чем Seq.Это устраняет путаницу в нижнем и верхнем регистре на Seqs.

1 голос
/ 07 июля 2011

Перечислитель, рассматриваемый с точки зрения функционального программирования, является в точности функцией fold. Если класс реализует интерфейс Enumerable в библиотеке объектно-ориентированных структур данных, тип поставляется с функцией fold в библиотеке функциональной структуры данных.

Stream - это немного странный императивный ленивый список (обязательно, когда чтение элемента разрушительно). CamlP5 поставляется с функциональной библиотекой отложенных списков Fstream. Эта уже процитированная тема предлагает несколько альтернатив .

0 голосов
/ 06 июля 2011

Упомянутая библиотека аккумуляторов также предоставляет оператор (-):

# 1 -- 100;;
- : int BatEnum.t = <abstr>

Перечисление не оценивается, пока вы не пройдете элементы, поэтому оно предоставляет функцию, аналогичную вашему второму запросу.Просто помните, что батареи enum являются изменчивыми.В идеале должна быть реализация с отложенным списком, в которой все структуры данных могут быть преобразованы в / из, но эта работа еще не выполнена.

0 голосов
/ 06 июля 2011

Кажется, вы ищете что-то вроде Ленивых списков. Проверьте это ТАК вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...