Бесконечная последовательность в SML


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

  • 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 ответ

Просто. У вас есть куча минусов (int, -> Минусы (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;
Другие вопросы по тегам