Как перебрать поток в Ocaml - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь перебрать поток, чтобы распечатать содержимое.

type 'a stream = Nil | Cons of 'a * 'a stream thunk and 'a thunk = unit -> 'a

Здесь вызывается моя функция

|> iter_stream ~f:(fun (f,c,l) -> printf "%s %s %s\n" f c l)

А это тип

let rec iter_stream st ~f 
(* val iter_stream : 'a stream -> ('a -> unit) -> unit *)

Я не могу найти никаких примеров того, как реализовать это. Единственная идея, которая у меня есть, - думать об этом как о списке, который явно неверен, поскольку я получаю ошибки типа.

let rec iter_stream st ~f =
match st with
| None -> ()
| Some(x, st') -> f x; iter_stream st' ~f

1 Ответ

0 голосов
/ 27 мая 2020

Ваш поток очень похож на список, за исключением того, что вам нужно вызвать функцию, чтобы получить конец списка.

Предлагаемый вами код содержит много fl aws. Я вижу следующие два основных fl aws:

  1. Вы используете конструкторы None и Some, в то время как поток имеет конструкторы Nil и Cons.

  2. Вы не вызываете функцию для получения хвоста потока. Обратите внимание, что в Cons (a, b), b является «преобразователем потока», т. Е. Это функция, которую вы можете вызвать для получения потока.

(возможно, это единственные два fl aws: -)

Надеюсь, это поможет.

...