ML中的序列(有限和无限)

时间:2011-01-07 11:44:36

标签: sml smlnj ml

好,

我有下一个序列定义:

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

我需要实现下一个功能:

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

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

功能:

  1. 如果n< = 0,则返回相同的seq。
  2. else返回一个seq,它的前n个元素是原始seq中的前n个元素,谓词为它们返回true,其余元素将相同。
  3. 例如,如果谓词是(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?)

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你需要将n-1包裹在parens中,否则它被解释为多个参数。完成后,它将编译。

然而,代码中仍然存在逻辑错误:无论谓词是否匹配,您都在减少n。但是,规范说您应该选择谓词匹配的n元素,而不是检查n元素的谓词。因此,如果谓词匹配,则只应减少n,否则保持相同n

修复后,您的代码应符合规范(包括2.1和2.2)。