私はシーケンスの次の定義を持っている:
datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
私は次の関数を実装する必要があります。
filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq
関数は、真または偽、n(整数)およびシーケンスを返す述語関数を取得します。
機能:
- もしN < = 0戻り同じ配列。
- それ以外の場合は、最初のn個の要素が元のseqの最初のn個の要素であり、述部がtrueを返し、残りの要素が同じであるseqを返します。 例えば
、述語がある場合(X MOD 2)および配列は、1,2,3,4,5である...およびn 3ので、新しい配列は 2,4,6であります、7,8、...
また、私は別の2つのオプションをチェックする必要がありますseqが有限であり、その後、彼らのために真の新しい配列を返す述語よりも少ないn個の要素を持っている場合
2.1) のみが含まれ、述語がそれらに対して真を返す要素が含まれます。
2.2)seqが無限で、述語がtrueを返すn要素未満の場合、新しい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())
;
構文エラーや抜本的なchange..Iがわかりませんか?
(また、2.1 ANS 2.2のために、私はちょうど私が(無記号とn> 0)得た場合、その後無記号を返すこと?チェックする必要がある)任意の助けを事前に
感謝。
将来の注意:コンパイラのエラーメッセージが表示された場合は、エラーが発生したというだけでなく、質問で引用する必要があります。これにより、回答者がエラーを見つけやすくなります。 – sepp2k