Что минусы делают в этой функции?

Я в замешательстве относительно того, что Cons() Функция делает, в определении функции для от.

2 ответа

Решение

Какие Stream представляет собой ленивый и потенциально бесконечный список. Поскольку SML стремится, это должно быть сделано немного окольным путем.

Давайте сначала посмотрим, как работают обычные списки:

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

Минусы состоит из двух частей:

  • Первый элемент в списке
  • Остальная часть списка

В ленивом списке это очень похоже.

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Вторая часть нашего Consна (), который производит succ 1что в свою очередь Cons(1, fn () => succ 2), Теперь мы можем видеть, что второй элемент в списке 1,

Если мы повторим этот процесс, мы получим, что список представляет бесконечный список [0, 1, 2, ...],

Вы также можете увидеть это, пытаясь сделать

val firstnats = take 10 naturals;

и видя, что вы получаете.

Это один из двух конструкторов Stream. Смотрите вторую строку этого скриншота - это все, что нужно для минусов.

Другие вопросы по тегам