Хорошо,
У меня есть следующее определение последовательности:
datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
Мне нужно реализовать следующую функцию:
filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq
Функция получаетфункция предиката, которая возвращает истину или ложь, n (целое число) и последовательность.
Функциональность:
- , если n <= 0, возвращает тот же результат.</li>
- иначе возвращает seq, что его первые n элементов являются первыми n элементами в оригинальном seq, который предикат возвращает для них true, а остальные будут такими же.
Например, если предикат (x mod 2) и seq равен 1,2,3,4,5 ... и n равен 3, значит, новый seq равен 2,4,6,7,8, ...
Кроме того, я должен проверить еще 2 параметра:
2.1), если seq конечен и имеет менее n элементов, которые предикат возвращает true для них, тогда новый seq будет содержать только элементы, которые предикат, возвращают для них true.
2.2) если seq бесконечен и имеет менее n элементов, которые предикат возвращает true для них, тогда новый seq будет содержать все элементыэтот предикат возвращает true для них, и при попытке получить следующий элемент он войдет в бесконечный цикл.
Мой текущий код логически был запланирован на данный момент без учета 2.1 и 2.2 (хотя я получаю ошибки и могу найти причину?)
fun filter_n (predicate: 'a -> bool ) (n: int) Nil = Nil
| filter_n (predicate: 'a -> bool ) (n: int) (Cons(x, xf)) =
if(n <= 0) then Cons(x, xf)
else
if predicate x then Cons(x, fn() => filter_n predicate n-1 (xf()) )
else filter_n predicate n-1 (xf())
;
синтаксические ошибки или радикальные изменения .. Я не уверен?
(также для 2.1 и 2.2 мне просто нужно проверить, что если я получил (Nil и n> 0), то вернуть Nil?)
Заранее спасибо за любую помощь.