在SML中展平流

时间:2012-02-25 09:59:29

标签: functional-programming sml smlnj

我有这个数据类型:

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

我想编写一个扁平函数,其类型如下。

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

flatten函数将流作为输入流并通过附加它们来展平它。

我该怎么做?有什么想法吗?

感谢。

编辑:我知道如何为列表执行此操作。这很简单: fun flatten [] = [] | flat (l::ls) = l @ flatten ls; 请帮我流,我不知道如何模拟匹配流的流。

1 个答案:

答案 0 :(得分:1)

让我们先写一下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))              

以上应该是显而易见的。现在,我们只需要稍微更改它以支持streamSusp结尾和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))