2011-01-07 4 views
2

Okay,Seuqences in ML (finite & infinnite)

ich die nächste Definition der Sequenz haben:

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

ich die nächste Funktion implementieren müssen:

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

Die Funktion erhält eine Prädikatfunktion, die wahr oder falsch, n (ganze Zahl) und Sequenz zurückgibt.

Die Funktionalität:

  1. wenn n = 0 < Rückkehr der gleiche Seq.
  2. sonst geben Sie einen Seq zurück, dass seine ersten n Elemente die ersten n Elemente im ursprünglichen Seq sind, dass das Prädikat für sie wahr zurückgibt und der Rest derselbe sein wird.

Wenn beispielsweise das Prädikat (x mod 2) und die Seq 1,2,3,4,5 ... und n 3, so dass die neue seq ist 2,4,6 , 7,8, ...

Außerdem sollte ich noch 2 Optionen prüfen:

2.1), wenn die f endlich ist und weniger als n Elemente, die Renditen gilt für sie dann die neue seq Prädikat enthält nur die Elemente, die Prädikatswerte für sie zurückgibt. Wenn das Seq unendlich ist und weniger als n Elemente enthält, die das Prädikat für sie zurückgibt, dann enthält das neue Seq alle Elemente, die das Prädikat für sie zurückgibt und wenn es versucht, das nächste Element zu erhalten, in das es eintreten wird eine Endlosschleife.

logisch Mein aktueller Code wurde nun geplant, ohne 2.1 und 2.2 unter Berücksichtigung (auch wenn ich Fehler bekommen und finden kann, warum?)

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()) 
; 

Syntaxfehler oder drastischer change..I ist nicht sicher?

(auch für 2.1 am 2.2 Ich brauche nur das zu überprüfen, ob ich bekam (Nil und n> 0), dann Nil zurückkehren?)

Vielen Dank im Voraus für jede Hilfe.

+1

Hinweis für die Zukunft: Wenn Sie eine Compiler-Fehlermeldung erhalten, sollten Sie es in Ihrer Frage angeben und nicht nur sagen, dass Sie einen Fehler erhalten. Auf diese Weise können die Beantworter den Fehler leichter finden. – sepp2k

Antwort

1

Sie müssen n-1 in Parens umbrechen, sonst wird es als mehrere Argumente interpretiert. Nachdem Sie das getan haben, wird es kompilieren.

Allerdings gibt es immer noch einen logischen Fehler in Ihrem Code: Sie verringern n, ob das Prädikat übereinstimmt oder nicht. Die Spezifikation besagt jedoch, dass Sie n Elemente auswählen sollten, in denen das Prädikat übereinstimmt, nicht dass Sie das Prädikat für n Elemente überprüfen sollten. Sie sollten also nur n verkleinern, wenn das Prädikat übereinstimmt und ansonsten n beibehalten.

Sobald Sie das behoben haben, sollte Ihr Code die Spezifikation (einschließlich 2.1 und 2.2) erfüllen.

+0

Danke. Ja, ich habe diesen kleinen logischen Fehler übersehen. Auch jetzt ist klar, warum 2.1 und 2.2 auch in Ordnung sind. – user550413

+0

Danke. Ja, ich habe diesen kleinen logischen Fehler übersehen. Auch jetzt ist klar, warum 2.1 und 2.2 auch in Ordnung sind. Es ist nicht das erste Mal, dass ich einen kleinen Syntaxfehler habe und ich kann nicht verstehen, was der Compiler/Interpreter Fehler ist. Ich benutze SMLNJ wie in der Klasse gefragt, aber im Gegensatz zu anderen Sprachen für eine so kleine Syntax Tippfehler druckt es Fehler über Operatoren überladen, etc. – user550413