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 № 1Uż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 -> ...
...