2017-03-17 1 views
1

Für den Abstand zwischen zwei Punkten, ohne die Funktionsdeklaration zu ändern, erhalte ich diesen Fehler "Konnte nicht den erwarteten Typ 'b' mit dem tatsächlichen Typ 'a' 'a' ist eine feste Typvariable, die durch den Typ gebunden ist Unterschrift für:“Zwei Punkte Abstand, Haskell ohne Änderung der Funktionserklärung?

type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
    dy = y2 - y1 
+0

haben Sie versucht, die Anwendung 'realToFrac' auf das Ergebnis der' sqrt' verwenden kann? – jakubdaniel

Antwort

2

sqrt kehrt der gleiche Typ wie sein Argument:

Prelude> :t sqrt 
sqrt :: Floating a => a -> a 

da Sie b als Argument sqrt sind die Bereitstellung, folgert Haskell, dass der Rückgabetypsein mussund nicht a.

Gibt es einen bestimmten Grund, warum Sie nicht

distance :: Floating b => Point b -> Point b -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
     dy = y2 - y1 
+0

Es ist in meiner Aufgabe erforderlich, dass ich den Funktionskopf nicht ändern soll, da wir den uns zur Verfügung gestellten Tester verwenden sollen – Sal

+0

@Sal Sie können diese Funktion leicht umwandeln, um die ursprüngliche Signatur zu erreichen, da Sie '' konvertieren können Zeigen Sie a auf Punkt b, wenn Sie "Real a" und "Fractional b" verwenden. – leftaroundabout

0
type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = realToFrac $ x2 - x1 
     dy = realToFrac $ y2 - y1 
+1

Dies ist jetzt die richtige Lösung, aber IMO "hier haben die Arbeitscode" Antworten sind nicht gut für Hausaufgabenfragen. – leftaroundabout

+0

es ist nicht die genaue Antwort, die ich suche, und das war nur eine kleine Funktion von einem größeren Projekt – Sal