Что минусы делают в этой функции?
Я в замешательстве относительно того, что 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. Смотрите вторую строку этого скриншота - это все, что нужно для минусов.