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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top