2011-12-18 31 views
5

Estoy tratando de hacer una función simple para devolver una cadena de texto centrada en Haskell, pero estoy teniendo problemas para encontrar la cantidad de relleno para insertar en cada lado. Tengo esto:Conversión entre tipos en Haskell

center padLength string = round ((padLength - (length string))/2) 

que da el siguiente error:

No instance for (Fractional Int) 
    arising from a use of '/' 
Possible fix: add an instance declaration for (Fractional Int) 
In the first argument of 'round', namely 
    '((padLength - (length string))/2)' 
In the expression: round ((padLength - (length string))/2) 
In an equation for `center': 
    center padLength string = round ((padLength - (length string))/2) 

¿Cómo puedo (básicamente) convertir de un doble (creo) a un Int?

Respuesta

9

El problema no es que no se puede convertir un Doble en un Int - round logra eso bien - es que está tratando de hacer la división en un Int (padLength - length string). El mensaje de error simplemente le dice que Int no es una instancia de Fractional, la clase de tipo para los números que se pueden dividir.

En general, se puede usar fromIntegral (padLength - length string) para convertirlo en un doble, pero en este caso, sólo tiene que utilizar la división entera directamente:

center padLength string = padLength - (length string) `div` 2 

a `div` b es sólo una manera más agradable de escribir div a b; puedes usar cualquier función como un operador binario como este.

+0

¿Por qué necesita el '? Soy un poco nuevo en Haskell –

+1

He agregado esa información a mi respuesta :) – ehird

1

Está tratando de usar la división fraccional / en operandos de tipo integral, pero eso no está definido.

Debe convertir los operandos a Doble antes de dividir (usando fromIntegral), o usar la división integral div.

Cuestiones relacionadas