好的,
我有序列的下一个定义:
datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
我需要实现下一个功能:
filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq
该函数获取一个谓词函数,该函数返回真或假、n(整数)和序列。
功能:
- 如果 n<=0 返回相同的序列。
- else 返回一个 seq,它的前 n 个元素是原始 seq 中谓词为它们返回 true 的前 n 个元素,其余的将是相同的。
例如,如果谓词是 (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 and n>0) 然后返回 Nil?)
提前感谢您的帮助。