Ocaml: ленивые списки

голова :

Имя

голова - произвела первую часть файлов

заголовок Резюме

[ ОПЦИЯ ]... [ ФАЙЛ ]...

Печать Описания

первые 10 строк каждого ФАЙЛА к стандартному выводу. Больше чем с одним ФАЙЛОМ предшествуйте каждому с заголовком, дающим имя файла. Без ФАЙЛА, или когда ФАЙЛ - читают стандартный вход.

Обязательные аргументы к долгим опциям обязательны для коротких опций также.
-c, - байты = [-] печать N первые байты N каждого файла; с продвижением '-', печатают все кроме последних байтов N каждого файла

8
задан Stas 30 May 2013 в 09:07
поделиться

4 ответа

В великом блоге, обладающем широкими правами, есть отличная статья на эту тему:

http://enfranchisedmind.com/blog/posts/ocaml-lazy-lists-an-introduction/

Вы также можете проверить http://batteries.forge.ocamlcore.org/doc.preview%3Abatteries-beta1/html/api/Lazy%5Flist.html

, которая является стандартной библиотекой для работы с этим .

Этот вопрос также очень похож на этот вопрос:

Какие библиотеки OCaml существуют для отложенной обработки списков?

9
ответ дан 3 November 2019 в 14:19
поделиться

Использование потоков:

let f x = Stream.from (fun n -> Some (x * int_of_float (2.0 ** float_of_int n)))

или

let f x =
  let next = ref x in
    Stream.from (fun _ -> let y = !next in next := 2 * y ; Some y)

Использование пользовательского типа lazy_list :

type 'a lazy_list =
  | Nil
  | Cons of 'a * 'a lazy_list lazy_t
let rec f x = lazy (Cons (x, f (2*x)))
13
ответ дан 3 November 2019 в 14:19
поделиться

Also, there is a lazy list module called Cf_seq in my OCaml Network Application Environment Core Foundation. In fact, I wrote a whole passle of functional data structures. It's all available under a 2-clause BSD license. Enjoy.

Update: the code has been renamed "Oni" and it's now hosted at BitBucket. You can also use the GODI package for it.

3
ответ дан 3 November 2019 в 14:19
поделиться

Если вы хотите сделать это вручную, я бы сказал, что у вас есть основные параметры:

  • Используйте собственный тип lazy_list , как сказал ephemient (кроме его решение немного не работает):

     введите 'a lazy_list =
    | Ноль
    | Минусы 'a *' lazy_list
    
    пусть голова = функция
    | Nil -> ошибка "Не удается извлечь заголовок пустого списка"
    | Минусы (h, _) -> h
    
    пусть хвост = функция
    | Nil -> ошибка "Не удается извлечь хвост из пустого списка"
    | Минусы (_, t) -> t
    
  • Используйте своего рода преобразователь (вроде того, что используется для реализации ленивого вычисления на языке, который его не поддерживает). Вы определяете свой список как функцию unit -> 'a , которая говорит, как получить следующий элемент из текущего (нет необходимости использовать для этого потоки). Например, чтобы определить список всех натуральных целых чисел, вы можете сделать

     let make_lazy_list initial next =
     пусть lazy_list current () =
     пусть результат =! ток в
    текущий: = (следующий! текущий); результат
     в lazy_list (исходная ссылка)
    
    let naturals = make_lazy_list 0 (функция i -> i + 1)
    

    Если вы выполните

     print_int (naturals ());
    print_int (натуральные ());
    print_int (натуральные ())
    

    вы получите следующий результат:

     0
    1
    2
    
2
ответ дан 3 November 2019 в 14:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: