бесконечная последовательность в SML - PullRequest
0 голосов
/ 23 мая 2011


Я должен кодировать функцию, которая получает последовательность (конечную или бесконечную) и возвращает идентичную последовательность с той лишь разницей, что если во время последовательности возникает исключение, то функция возвращает последовательность в ее начало.
Другими словами, функция должна возвращать циклическую последовательность, которая повторяется, когда она заканчивается. Я должен поймать исключение с помощью ручки.
Следующий пример должен работать.

  • listToSeq [1,2];
    val it = Минусы (1, fn): int seq
  • restartOnError it;
    val it = Минусы (1, fn): int seq
  • Хвост это;
    val it = Минусы (2, fn): int seq
  • Хвост это;
    val it = Минусы (1, fn): int seq
  • Хвост его;
    val it = Минусы (2, fn): int seq

Может кто-нибудь мне помочь?

1 Ответ

1 голос
/ 30 августа 2011

Simple.У вас есть куча минусов (int, -> Cons (int, ...)) (похоже), и вы хотите откатиться назад.Смотрите и учитесь, и продумайте это до конца.Когда вы вызываете fn, который делает следующего эльта в списке, вы не хотите называть его прямо, а обрабатывать каждый раз и возвращаться к началу, если это необходимо.Итак, вы пишете, что сначала fn.Затем вы хотите парня, который превратит любого эльта в нового в списке, с новым настроением, которое отправит вас обратно на старт.Итак, вы напишите этого парня следующим (третья строка ниже).Наконец, просто верните ответ.Простой код должен легко следовать (псевдокод; не вполне компилируется и может иметь хакелизмы).

fun cycle l =
    let fun handleNext next = ((next()) handle whatever => l);
        fun next (Cons(n, fn)) = Cons(n, fun ()=>next(handleNext fn))
    in next l end;
...