голова :
голова - произвела первую часть файлов
[ ОПЦИЯ ]... [ ФАЙЛ ]...
первые 10 строк каждого ФАЙЛА к стандартному выводу. Больше чем с одним ФАЙЛОМ предшествуйте каждому с заголовком, дающим имя файла. Без ФАЙЛА, или когда ФАЙЛ - читают стандартный вход.
Обязательные аргументы к долгим опциям обязательны для коротких опций также.
-c, - байты = [-] печать N первые байты N каждого файла; с продвижением '-', печатают все кроме последних байтов N каждого файла
В великом блоге, обладающем широкими правами, есть отличная статья на эту тему:
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 существуют для отложенной обработки списков?
Использование потоков:
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)))
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.
Если вы хотите сделать это вручную, я бы сказал, что у вас есть основные параметры:
Используйте собственный тип 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