4

なぜこのエラーが発生するのか疑問に思っています。これは、整数から16進値に変換する割り当て用です。整数値を で変更するときに、このヘルパー変換関数を呼び出します16。(整数値と連結さ16れ、再帰呼び出しで除算されます)

これが私のコードです:

    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'
4

1 に答える 1

10

一重引用符 ( 'F') を使用すると、Charリテラルが得られます。実際には値のリストであるStringリテラルのChar場合は、二重引用符 ( "F") を使用する必要があります。

Stringは のエイリアスであるため、から[Char]に変換する場合はChar、を 1 要素リストでStringラップするだけです。Charそのための関数は次のようになります。

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

これは通常、または(:[])と同等の としてインラインで記述されます。\x -> (x : [])\x -> [x]

余談ですが、たとえば型クラスを使用して、コードを大幅に簡素化できますEnum

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"

より一般的には、次のような関数があるときはいつでも:

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

これを次のようにして、反復の少ない、より効率的な同等のものに変換できますcase

f x = case x of
  A -> ...
  B -> ...
  C -> ...
  ...
于 2013-02-19T02:23:38.817 に答える