Mi chiedo perché sto ricevendo questo errore. È per un compito in cui i "m" converte da un numero intero in un valore esadecimale. Chiamo questa funzione di conversione helper quando mod il valore intero da 16
. (concatenato con il valore intero che poi divido per 16
in una chiamata ricorsiva)
Ecco il mio codice:
changeToHex :: Integer -> String
--main function
toHex :: Integer -> String
toHex x
|x == 0 = "0"
|x == 1 = "1"
|x == 2 = "2"
|x == 3 = "3"
|x == 4 = "4"
|x == 5 = "5"
|x == 6 = "6"
|x == 7 = "7"
|x == 8 = "8"
|x == 9 = "9"
|x == 10 = "A"
|x == 11 = "B"
|x == 12 = "C"
|x == 13 = "D"
|x == 14 = "E"
|x == 15 = "F"
risposte:
9 per risposta № 1Utilizzando virgolette singole ("F"
) ti dà un Char
letterale. Per un String
letterale, che in realtà è un elenco di Char
valori, dovresti usare virgolette doppie ("F"
).
Da String
è un alias per [Char]
, se si desidera convertire da a Char
a a String
, puoi semplicemente avvolgere il file Char
in un elenco di un elemento. Una funzione per farlo potrebbe apparire come:
stringFromChar :: Char -> String
stringFromChar x = [x]
Questo è tipicamente scritto in linea, come (:[])
, equivalente a x -> (x : [])
o x -> [x]
.
A parte questo, puoi semplificare notevolmente il tuo codice, usando ad esempio il Enum
typeclass:
toHexDigit :: Int -> Char
toHexDigit x
| x < 0 = error "toHex: negative digit value"
| x < 10 = toEnum $ fromEnum "0" + x
| x < 15 = toEnum $ fromEnum "A" + x - 10
| otherwise = error "toHex: digit value too large"
Più in generale, ogni volta che hai una funzione come:
f x
| x == A = ...
| x == B = ...
| x == C = ...
...
Puoi convertirlo in un equivalente meno ripetitivo, più efficiente con case
:
f x = case x of
A -> ...
B -> ...
C -> ...
...