/ / Haskell Nie można dopasować oczekiwanego typu 'String' z faktycznym typem 'Char' - string, haskell, char

Haskell Nie można dopasować oczekiwanego typu 'String' z faktycznym typem 'Char' - string, haskell, char

Zastanawiam się, dlaczego otrzymuję ten błąd.Jest to dla zadania, gdzie jestem przekonwertować z liczby całkowitej do wartości szesnastkowej.Funkcja ta nazywa się funkcją konwersji pomocnika, gdy mod wartość całkowitą przez 16. (połączony z wartością całkowitą, którą następnie dzielę przez 16 w rekurencyjnym wywołaniu)

Oto mój kod:

    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"

Odpowiedzi:

9 dla odpowiedzi № 1

Używanie pojedynczych cudzysłowów ("F") daje ci Char dosłowny. Dla String dosłowny, który w rzeczywistości jest listą Char wartości, powinieneś używać podwójnych cudzysłowów ("F").

Od String to alias dla [Char], jeśli chcesz przekonwertować z a Char do a String, możesz po prostu owinąć Char na liście jednoelementowej. Funkcja do tego może wyglądać następująco:

stringFromChar :: Char -> String
stringFromChar x = [x]

Jest to zazwyczaj napisane inline, as (:[]), równoważny x -> (x : []) lub x -> [x].

Na marginesie możesz znacznie uprościć swój kod, używając na przykład 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"

Bardziej ogólnie, za każdym razem, gdy masz funkcję taką jak:

f x
| x == A = ...
| x == B = ...
| x == C = ...
...

Możesz przekonwertować to na mniej powtarzalny, wydajniejszy odpowiednik case:

f x = case x of
A -> ...
B -> ...
C -> ...
...