/ / Haskell Impossibile trovare il tipo previsto 'String' con il tipo effettivo 'Char' - string, haskell, char

Haskell potrebbe non corrispondere al tipo previsto 'String' con il tipo effettivo 'Char' - stringa, haskell, char

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 № 1

Utilizzando 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 -> ...
...