わかった、
シーケンスの次の定義があります:
datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
次の関数を実装する必要があります。
filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq
この関数は、trueまたはfalse、n(整数)およびシーケンスを返す述語関数を取得します。
機能:
- n <= 0の場合、同じシーケンスを返します。
- それ以外の場合は、最初のn個の要素が元のseqの最初のn個の要素であり、述語がそれらに対してtrueを返し、残りは同じになるというseqを返します。
たとえば、述語が(x mod 2)で、seqが1,2,3,4,5 ...であり、nが3である場合、新しいseqは2,4,6,7,8、..です。
さらに、別の2つのオプションを確認する必要があります。
2.1)seqが有限であり、述語がtrueを返す要素がn未満の場合、新しいseqには、述語がtrueを返す要素のみが含まれます。
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())
;
構文エラーまたは大幅な変更..わかりませんか?
(また、2.1および2.2の場合、(Nilおよびn> 0)を取得した場合は、Nilを返すかどうかを確認する必要がありますか?)
助けてくれてありがとう。