2

わかった、

シーケンスの次の定義があります:

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の場合、同じシーケンスを返します。
  2. それ以外の場合は、最初の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を返すかどうかを確認する必要がありますか?)

助けてくれてありがとう。

4

1 に答える 1

1

かっこで囲む必要がありn-1ます。そうしないと、複数の引数として解釈されます。それを行った後、それはコンパイルされます。

ただし、コードにはまだ論理エラーがありますn。述語が一致するかどうかに関係なく、減少しています。nただし、仕様では、述語の要素をチェックするのではなく、述語が一致する要素を選択する必要があると規定されてnいます。nしたがって、述語が一致する場合にのみ減少し、それ以外の場合は同じままにする必要がありnます。

これを修正すると、コードは仕様(2.1および2.2を含む)を満たす必要があります。

于 2011-01-07T13:00:39.353 に答える