2

好的,

我有序列的下一个定义:

datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);

我需要实现下一个功能:

filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq

该函数获取一个谓词函数,该函数返回真或假、n(整数)和序列。

功能:

  1. 如果 n<=0 返回相同的序列。
  2. 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?)

提前感谢您的帮助。

4

1 回答 1

1

您需要n-1用括号括起来,否则它会被解释为多个参数。完成后,它将编译。

但是,您的代码中仍然存在逻辑错误:您正在减少n谓词是否匹配。但是规范说您应该选择n谓词匹配的元素,而不是您应该检查谓词中的n元素。所以你应该只n在谓词匹配时减少,否则保持不变n

一旦你解决了这个问题,你的代码应该符合规范(包括 2.1 和 2.2)。

于 2011-01-07T13:00:39.353 回答