Применить функцию к потоку - PullRequest
1 голос
/ 06 марта 2012

Если у меня есть функция f и поток s. Как я могу применить эту функцию к потоку. Похоже на то, как будет работать List.map.

Это бесконечный поток любого типа:

type 'a stream = Cons of 'a * (unit -> 'a stream)

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

type 'a stream = Cons of 'a * (unit -> 'a stream) 

let rec map f (cons(x,xsf)) = f x then map f (xsf)

1 Ответ

4 голосов
/ 06 марта 2012

Что-то вроде этого должно работать:

module Stream =
    let rec map f (Cons(x,xs)) =
        Cons(f x,fun () -> xs() |> map f)

Это определяет модуль Stream, где мы можем хранить полезные функции для работы с потоками (аналогично модулю List), всего с однимmap функция в нем.Функция map принимает функцию f и поток, созданный путем преобразования x в функцию xs, и отображает f в потоке, возвращая новый поток, голова которого равна f x, а хвост которого получен путем сопоставления f по потоку, полученному в результате вызова xs.

...