DrRacket/Schema: Vertragsverletzung, Zahl erwartet?
Also ich habe 3 definierten Funktionen in scheme sumlist summiert alle zahlen in einer Liste, und meinen Sie, gibt mir den Mittelwert der Liste. mean2 Anrufe bedeuten und tut die gleiche Sache, aber ich bekomme eine Fehlermeldung. Es sagt, der Fehler kommt von sumlist Funktion.
(define (sumlist lst)(if(null? lst)0 (+(car lst)(sumlist(cdr lst)))))
(define mean (lambda x(/(sumlist x)(length x))))
(define mean2 (lambda x(mean x)))
Dies ist, wie rufe ich die Funktionen
(mean 1 2 3 4 5)
=>3 ;it works
(mean2 1 2 3 4 5)
+: contract violation
expected: number?
given: '(1 2 3 4 5)
argument position: 1st
other arguments...:
0
Ich bin immer noch neues zu Schema habe gerade eingeführt, um es Letzte Woche, aber es ist wirklich frustrierend..was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
(define (x . y) ...)
ist das gleiche wie(define x (lambda y ...))
,die folgenden Implementierungen von
identity
sind die gleichenWährend der folgenden Umsetzung
list
sind die gleichenSo, wenn Sie Sie anwenden
(mean2 2 3 4 5)
x
ist die Liste(2 3 4 5)
, und(mean '(2 3 4 5))
auch umschließt alle Argumente in einer Liste angezeigt, sodass der Aufrufsumlist
verwandelt sich in(sumlist '((2 3 4 5)))
. In sumlist Sie versuchen zu tun(+ '(2 3 4 5) 0)
das wird nicht funktionieren, da+
erwartet zahlen als Argumente, keine Listen. Um dies zu beheben, müssen Sie definierenmean2
als einer der:Ich würde verwenden Sie die Methoden in der Reihenfolge des Erscheinens. Manchmal mit gilt ist der beste, aber nicht, wenn Sie nur alias oder wickeln.