Frage

Ich unterrichte mich Haskell.

Ich möchte eine Funktion schreiben, die rekursiv die erste Zahl findet, die eine ganzzahlige Quadratwurzel hat und kleiner als eine Startnummer ist.

Es sieht aus wie das:

findFirstSquare :: Int -> Int
findFirstSquare x
    | x <= 0                                  = error "This function only works for 1 or above"
    | fromInteger(floor(sqrt(x))) == (sqrt x) = x
    | otherwise                               = intSqrt(x - 1)

Aber GHC beschwert sich:

Keine Instanz für (Realfrac int), die sich aus der Verwendung von "Boden" bei ...

Wenn ich jedoch Folgendes in GHCI einmachte, kompiliert es ihn glücklich:

 fromInteger(floor(sqrt(4))) == (sqrt 4)

Meine Frage ist: Warum bekomme ich einen Typfehler von einem Ausdruck, der erfolgreich in GHCI kompiliert?

War es hilfreich?

Lösung

Ok, ich habe es herausgefunden.

Der Unterschied besteht Schweben 4

Meine Funktion deklariert X jedoch X als eine Int, Deshalb musste ich ein von Integral zu den Aufrufen an SQRT hinzufügen, damit sie funktionieren würden.

Das Ändern der Mittelwache in Folgendes hat den Trick gemacht:

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top