7

Cons()from の関数定義で、関数が何をするのか混乱しています。

ここに画像の説明を入力

4

2 に答える 2

10

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 1Cons(1, fn () => succ 2)1

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

しようとすることでこれを見ることもできます

val firstnats = take 10 naturals;

そしてあなたが得るものを見る。

于 2012-02-12T11:35:16.247 に答える
1

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

于 2012-02-12T05:16:14.340 に答える