2012-02-12 6 views

答えて

8

Streamは、lazyであり、無限の可能性のあるリストです。 SMLはeagerなので、これは少し丸い方法で行う必要があります。

通常のリストがどのように動作するかでみましょう初見:

  • リストの最初の要素
  • リスト
の残り:

datatype 'a list = [] | :: of 'a * 'a list 

短所は、2つの部分から構成され

遅延リストでは、かなり似ています。ここ

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 

短所は、以下からなる:リスト内

  • 最初の要素
  • ()
に評価した場合リスト の残りの部分を生成する機能

だから、原則はほとんど同じであることがわかります一緒に仕事するのがもっと難しい。

はのは、例のリストを見てみましょう:

fun succ n = Cons (n, fn() => succ (n+1)) 
val naturals = succ 0 

これは何を作るのか?それを見てみましょう。

naturalsは、succ 0と定義され、順にCons(0, fn() => succ 1)と定義されます。これから、リストの最初の要素が0であることがわかります。

もう一度進んでみましょう。私たちは、、Consの2番目の部分を()と評価しており、succ 1を生成し、これは次にCons(1, fn() => succ 2)です。これでリストの2番目の要素が1であることがわかりました。

このプロセスを繰り返すと、リストは無限リスト[0, 1, 2, ...]を表しています。

また

val firstnats = take 10 naturals; 

をやろうとしていると何を得る見て、これを見ることができます。

1

これは、ストリームの2つのコンストラクタの一つです。そのスクリーンショットの2行目を参照してください。

関連する問題