2017-07-14 116 views
1

因此,我目前正在学习考试,我一直在试图解决这个练习,但我真的不知道如何。计算函数返回true的列表中的元素

我需要实现一个函数,该函数将`a list和'a - > bool函数作为参数,并返回'a - 列表元素的数量,当给予'a - > bool函数时返回true作为参数。

到目前为止,这是我试过的代码:

test([],funct) = [] 
    |test(x::xs,funct) = if (funct(x) then 1 + test(xs,funct) 
         else 0 + (xs,funct); 

错误:子句类型不匹配前面的类的类型; 任何帮助,将不胜感激。

回答

1

两个问题:

  • 在空单的情况下,你返回一个列表,而不是数量。
  • 在另一种情况下,else部分缺少递归调用test
+0

除此之外,我会在你的else语句中避免使用'0+'。 –

+0

@MarcoLuzzara,我会写'(如果...然后1其他0)+ ...',并避免重复呼叫。 –

+0

现在,你让我注意到它,我同意。 –

3

如果你解决了这个有折叠,

fun countp p xs = List.foldl (fn (x, c) => if p x then c+1 else c) 0 xs 

功能也将是tail-recursive