Domanda

Sto insegnando me stesso Haskell.

voglio scrivere una funzione che trova ricorsivamente il primo numero che ha una radice quadrata intero ed é più piccolo di un numero iniziale.

Ecco come si presenta:

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)

Ma GHC si lamenta:

  

Nessuna istanza per (RealFrac Int) derivanti da un uso del `piano' a ...

Tuttavia, se si digita quanto segue in GHCi, felicemente lo compila:

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

La mia domanda è:? Perché mi appare un errore di tipo da un'espressione che compila con successo in GHCi

È stato utile?

Soluzione

Ok, ho capito.

La differenza è che la costante "4" è sovraccarico, interattivamente sqrt (4) è sempre la radice quadrata della Float 4

Tuttavia la mia funzione dichiara x come un Int , quindi avevo bisogno di aggiungere un fromIntegral alle chiamate a sqrt, in modo che essi avrebbero lavorato.

La modifica della guardia mezzo al seguente ha fatto il trucco:

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top