Erro do tipo GHC que eu não entendo
Pergunta
Estou me ensinando Haskell.
Quero escrever uma função que encontre recursivamente o primeiro número que possui uma raiz quadrada inteira e é menor que um número inicial.
Se parece com isso:
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)
Mas o GHC reclama:
Nenhuma instância para (RealFrac Int) decorrente de um uso de `piso 'em ...
No entanto, se eu digitar o seguinte no GHCI, ele o compilará alegremente:
fromInteger(floor(sqrt(4))) == (sqrt 4)
Minha pergunta é: por que estou recebendo um erro de tipo de uma expressão que compila com sucesso no GHCI?
Solução
Ok, eu descobri.
A diferença é que a constante "4" está sobrecarregada; portanto, interativamente o sqrt (4) está recebendo a raiz quadrada do Flutuador 4
No entanto, minha função declara x como um Int, portanto, eu precisava adicionar um do Integral às chamadas ao SQRT, para que elas funcionassem.
Mudar a guarda do meio para o seguinte fez o truque:
| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x