Рекурсивные типы данных и типы в Objective C - PullRequest
3 голосов
/ 31 мая 2011

Похожие:
Ленивые типы данных в Objective C

Из соответствующего вопроса я смог понять, как использоватьблокировать объекты для имитации приостановленных вычислений, но я все еще пытаюсь понять концепцию.Для horribleComputation это будет работать, но как можно моделировать бесконечный поток?

Как это обычно делается в SML,

(* Have a datatype to wrap a computation *)
datatype 'a susp = Susp of (unit -> 'a)

(* Create a recursive datatype to handle an infinite stream  *)
datatype 'a stream = Cons of 'a * ('a stream') susp
type 'a stream = ('a stream') susp

Теперь в Objective-C есть typedef, которыйпринимает предопределенные значения

enum suit {hearts, spades, diamonds, clubs};

Я просто не могу понять, как получить Cons из part

На данный момент, если бесконечное моделирование данных невозможно, какБудет ли одна модель, например, карточная рука.Снова в SML,

datatype suit = Clubs | Spades | Hearts | Diamonds
datatype rank = Two | Four | Five (*... etc *)

(* Then a card *)
type card = rank*suit

(* And now we can have a Hand :) *)
datatype hand = Empty | Hand of card * hand;

Скорее всего, все не подлежит передаче, но мне просто любопытно, насколько хорошо я могу использовать Objective C для ленивого программирования ... например, для обработки всех натуральных чисел по требованию.Я делал круги с моим поиском этого.

1 Ответ

3 голосов
/ 31 мая 2011

Есть два отдельных, ортогональных понятия: рекурсивные типы данных и ленивые вычисления. В C и C-подобных языках вы моделируете первый с struct, который содержит указатель (и) либо на себя, либо на другой тип данных, который содержит / указывает на этот struct прямо или косвенно. Используйте блочные объекты или что-то еще, чтобы приостановить ваши вычисления. Объедините две концепции вместе и получите struct, который содержит указатель на приостановленное вычисление, которое возвращает (указатель на), что struct.

...