好,
我有下一个序列定义:
datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
我需要实现下一个功能:
filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq
该函数获取一个谓词函数,该函数返回true或false,n(整数)和序列。
功能:
例如,如果谓词是(x mod 2)并且seq是1,2,3,4,5 ......并且n是3所以新的seq是 2,4,6,7,8,... 的
另外,我应该检查另外两个选项:
2.1)如果seq是有限的并且少于n个元素,谓词为它们返回true,那么新的seq将包含 only 谓词为它们返回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?)
提前感谢您的帮助。
答案 0 :(得分:1)
你需要将n-1
包裹在parens中,否则它被解释为多个参数。完成后,它将编译。
然而,代码中仍然存在逻辑错误:无论谓词是否匹配,您都在减少n
。但是,规范说您应该选择谓词匹配的n
元素,而不是检查n
元素的谓词。因此,如果谓词匹配,则只应减少n
,否则保持相同n
。
修复后,您的代码应符合规范(包括2.1和2.2)。