Сглаживание потока в SML - PullRequest
       12

Сглаживание потока в SML

1 голос
/ 25 февраля 2012

У меня есть этот тип данных:

datatype 'a stream' = Susp of unit -> 'a stream
and 'a stream = Empty | Cons of 'a * 'a stream'

, и я хочу написать функцию сглаживания, имеющую тип ниже.

flatten: ’a stream’ stream’ -> ’a stream’

Функция сглаживания будет принимать поток потоков в качестве вводаи сгладить это, добавив их.

Как мне это сделать?Есть идеи?

Спасибо.

Редактировать: Я знаю, как это сделать для списков.Это довольно просто: fun flatten [] = [] | flat (l::ls) = l @ flatten ls; Помогите мне с потоками, пожалуйста, я не знаю, как сопоставить шаблон с потоком.

1 Ответ

1 голос
/ 19 марта 2016

Давайте сначала напишем это для list:

fun append(xs, ys) = case xs of
    [] => ys
  | (x::xs) => x :: append(xs, ys)              

fun flatten(xss) = case xss of
    [] => []
  | (xs::xss) => append(xs, flatten(xss))              

Вышесказанное должно быть очевидным.Теперь нам нужно только немного изменить его, чтобы он поддерживал stream, заканчивая Susp и force на соответствующих шагах:

fun force(Susp(xs)) = xs()                                        

fun append(xs, ys) = case force xs of
    Empty => ys
  | Cons(x,xs) => Susp(fn () => Cons(x, append(xs, ys)))

fun flatten(xss) = case force xss of
    Empty => Susp(fn () => Empty)
  | Cons(xs,xss) => append(xs, flatten(xss))
...