2012-02-25 11 views
1

でストリームをフラット化。は、私はこのデータ型を持っているSML

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

flatten関数は、ストリームのストリームを入力として受け取り、追加してフラット化します。

どうすればよいですか?何か案は?

ありがとうございました。

編集:私はリストを作成する方法を知っています。それは非常に簡単です: fun flatten [] = [] | flat (l::ls) = l @ flatten ls; ストリームで私を助けてください、私はストリームのストリームに一致するパターンを知りません。

+0

私は、これは宿題であると仮定します。最初にリストリストを平坦化してストリームに適用することをお勧めします。 –

+0

@AndreasRossberg、私はリストのためにそれを行う方法を知っています。これはかなり単純です: 'fun flatten [] = [] |フラット(l :: ls)= l @ flatten ls; ' ストリームのヘルプをお願いします。ストリームのストリームとパターンを合わせる方法はわかりません。 – Dave

+1

あなたはいつものようにパターンマッチします: 'fun flatten Empty = ... | flatten(Cons(x、xs))= ... 'である。またストリームに 'append'を定義する必要があります。唯一残っているのは、正しい場所に 'fn'を挿入することです。 –

答えて

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))    

上記は明らかであろう。今、私たちは唯一の適切な手順で-ing終わるSuspforceにより、streamをサポートするために、わずかにそれを変更する必要があります。

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)) 
関連する問題