2011-01-07 8 views
2

さて、Seuqences(有限&infinnite)

私はシーケンスの次の定義を持っている:

datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq); 

私は次の関数を実装する必要があります。

filterq_n:('a -> bool) -> int -> 'a seq -> 'a seq 

関数は、真または偽、n(整数)およびシーケンスを返す述語関数を取得します。

機能:

  1. もしN < = 0戻り同じ配列。
  2. それ以外の場合は、最初のn個の要素が元のseqの最初のn個の要素であり、述部がtrueを返し、残りの要素が同じであるseqを返します。
  3. 例えば

、述語がある場合(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)得た場合、その後無記号を返すこと?チェックする必要がある)任意の助けを事前に

感謝。

+1

将来の注意:コンパイラのエラーメッセージが表示された場合は、エラーが発生したというだけでなく、質問で引用する必要があります。これにより、回答者がエラーを見つけやすくなります。 – sepp2k

答えて

1

n-1を括弧で囲む必要があります。それ以外の場合は、複数の引数として解釈されます。あなたがそれをした後、それはコンパイルされます。

あなたのコードにまだ論理エラーがあります:nは、述語が一致するかどうかにかかわらず減少しています。しかし、仕様では、n要素を選択する必要があります。n要素の述語をチェックする必要はありません。したがって、述語が一致する場合はnを減らし、それ以外の場合は同じnを保持する必要があります。

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

+0

ありがとうございます。はい、私はその小さな論理エラーを逃しました。また、なぜ2.1と2.2が大丈夫なのかはっきりしています。 – user550413

+0

ありがとうございます。はい、私はその小さな論理エラーを逃しました。また、なぜ2.1と2.2が大丈夫なのかはっきりしています。小さな文法エラーがあるのは初めてではなく、コンパイラ/インタプリタのエラーを理解できません。私はクラスで尋ねられるようにSMLNJを使用していますが、このような小さな構文ミスのための他の言語とは異なり、演算子のオーバーロードなどに関するエラーを出力します。 – user550413