Cons()
from の関数定義で、関数が何をするのか混乱しています。
2 に答える
Stream
表現するのは、怠惰で潜在的に無限のリストです。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
。
では、さらに一歩進んでみましょう。fn () => succ 1
の 2 番目の部分であるonCons
を評価します。これで、リストの 2 番目の要素が であることがわかります。()
succ 1
Cons(1, fn () => succ 2)
1
このプロセスを繰り返すと、リストが無限リストを表していることがわかります[0, 1, 2, ...]
。
しようとすることでこれを見ることもできます
val firstnats = take 10 naturals;
そしてあなたが得るものを見る。
これは、Stream の 2 つのコンストラクターの 1 つです。そのスクリーンショットの 2 行目を参照してください。Cons についてはこれですべてです。