2017-07-14 10 views
1

私は現在、試験のために勉強していますが、私はこの練習問題を解決しようとしていますが、関数が真を返すリスト内の要素をカウントする

'a - > bool関数をパラメータとして取り、' a - > bool関数に与えられたときtrueを返すリストの要素の数を返す関数を実装する必要がありますパラメータとして取られる。

これまでのところ、これは私が試したコードは次のとおりです。

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

エラー:句の種類が以前のクラスの型と一致していません。 ご協力いただければ幸いです。

答えて

1

2つの問題:あなたはリストではなく、数値を返す空のリストの場合は

  • もう1つのケースでは、elseの部分にtestへの再帰呼び出しがありません。
+0

さらに、私はあなたのelse文で '0 +'を避けるでしょう。 –

+0

@MarcoLuzzara、個人的に、私は '(if ... then 1 else 0)+ ...'と書いて、呼び出しの重複を避けます。 –

+0

あなたは私にそれを気付かせるようになったので、私は同意します。 –

3

あなたは折りたたみでこれを解決した場合は、

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

機能もtail-recursiveになります。

関連する問題