2011-12-18 16 views
5

Sto cercando di fare una semplice funzione per restituire una stringa di testo centrata in Haskell, ma sto avendo problemi a trovare solo quanto padding inserire da entrambi i lati. Ho questo:Conversione tra i tipi in Haskell

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

che dà il seguente errore:

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) 

Come posso (in pratica) la conversione da una doppia (credo) a un Int?

risposta

9

Il problema non è che non è possibile convertire un doppio in un Int - round è sufficiente - è che si sta tentando di eseguire una divisione su un numero Int (padLength - length string). Il messaggio di errore ti sta solo dicendo che Int non è un'istanza di Fractional, il typeclass per i numeri che possono essere divisi.

In generale, è possibile utilizzare fromIntegral (padLength - length string) per trasformarlo in un doppio, ma in questo caso, si può utilizzare semplicemente divisione intera direttamente:

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

a `div` b è solo un modo migliore di scrivere div a b; puoi usare qualsiasi funzione come un operatore binario come questo.

+0

Perché è necessario il '? Sono un po 'nuovo per Haskell –

+1

Ho aggiunto questa informazione alla mia risposta :) – ehird

1

Si sta tentando di utilizzare la divisione frazionaria / su operandi di tipo integrale, ma non è definito.

È necessario convertire gli operandi in Double prima della divisione (utilizzando fromIntegral) oppure utilizzare la divisione integrale div.

Problemi correlati