2016-06-05 13 views
-2

Ich habe versucht, eine sqrt+ Funktion zu erstellen, die eine Liste von Zahlen erhalten und eine Liste von Zahlen zurückgeben wird. Kann mir jemand sagen, was mit der Funktion nicht stimmt?erstellen sqrt Funktion im Schläger

#lang pl 03 

(: sqrt+ : (Listof Number) -> (Listof Number)) 
;; a version of `sqrt' that takes a list of numbers, and return a list 

;; with twice the elements, holding the two roots of each of the inputs; 

;; throws an error if any input is negative. 
(define (sqrt+ ns) 
    (cond [(null? ns) 0] 
     [(< (first ns) 0) (error 'ns "`sqrt' requires a nonnegative input ~s")] 
     [else ((sqrt ns) (* (sqrt ns) -1))])) 
Type Checker: type mismatch 
    expected: (Listof Number) 
    given: Zero 
    in: 0 
Type Checker: type mismatch 
    expected: Nonnegative-Real 
    given: (Pairof Nonnegative-Real (Listof Number)) 
    in: ns 
Type Checker: type mismatch 
    expected: Nonnegative-Real 
    given: (Pairof Nonnegative-Real (Listof Number)) 
    in: ns 
Type Checker: Summary: 3 errors encountered 
    in: 
    0 
    ns 
    ns 
+1

Hinweis: Fehler in der else-Klausel ist, wo Sie 'sqrt' auf einem' (ListOf Number) 'nennen. – Majora320

Antwort

1

Im else Fall sollten Sie verwenden:

(let ([s (sqrt (first ns))]) 
    (cons s 
     (cons (* s -1) 
       (sqrt+ (rest ns)))))` 
0

Die sonst Ursache verschieden sein muss, und wenn Sie eine leere Liste haben, die Art Rückkehr sollte auch sein, eine leere Liste und keine Nummer. Die Rückgabe der ersten Klausel Ihres cond sollte also "null" oder "nil" sein. Versuchen Sie, die unten statt mit (die Syntax vielleicht ein bisschen gezwickt werden müssen):

(define (sqrt+ ns) 
    (cond [(null? ns) ns] 
     [(< (first ns) 0) (error 'ns "`sqrt' requires a nonnegative input ~s")] 
     [else (cons (sqrt (first ns)) 
        (cons (* -1 (sqrt (first ns))) 
          (sqrt+ (rest ns))))]))