我有这个数据类型:
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;
请帮我流,我不知道如何模拟匹配流的流。
答案 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))
以上应该是显而易见的。现在,我们只需要稍微更改它以支持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))