簡體   English   中英

Haskell 返回十六進制值列表

[英]Haskell returning list with hexadecimal value

我正在嘗試定義 function “decToHex”,它返回與給定數字的十六進制值相對應的字符列表。 例如,1128 = ['4','6','8']

這是我的 function

decToHex :: Int -> [Char]
list = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
listHexa = []
decToHex x
  | x < 16 = list !! x
  | otherwise = decToHex (x `div` 16) : ((list !! (x `mod` 16)) : listHexa)

但我得到這個錯誤:

• Couldn't match type ‘[Char]’ with ‘Char’
  Expected type: [Char]
    Actual type: [[Char]]
• In the expression:
    decToHex (x `div` 16) : ((list !! (x `mod` 16)) : listHexa)

我錯過了什么?

您的list[String]類型,因為每個字母都有一個String 相反,通過用單引號替換雙引號使其成為Char列表。

回想一下不對稱運算符:在列表的左側添加一個元素,而對稱運算符++連接兩個列表。

因此,對於以以下方式開頭的表達式:

decToHex (x `div` 16) :  ... whatever ...

:的左操作數已經是一個字符串,即一個 Char 的列表。 所以整個表達式的類型必須是[[Char]] 但這與您的 function decToHex類型簽名相沖突,后者表示它只返回一個[Char]簡單列表。

旁注 1:當十六進制數字列表被稱為hexDigits而不是普通的list時,事情就不會那么混亂了。

旁注2:在除法中,如果您需要商和余數,則使用 function divMod而不是單獨使用divmod更具可讀性和效率。

因此,我們有以下代碼:

hexDigits  = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]

decToHex :: Int -> [Char]
decToHex x
    | x < 0      =  '-' : decToHex (-x)
    | x < 16     =  hexDigits !! x
    | otherwise  =  let  (q, r) = divMod x 16
                    in  (decToHex q)  ++  (hexDigits !! r)

旁注3:

就像其他一切一樣,列表在 Haskell 中是不可變的。 這意味着運算符++必須通過復制其左操作數來工作。 因此,以這種方式使用++進行遞歸是非常低效的。 您可能想找到一種方法來使用 operator :作為您的主要遞歸引擎。 您可能需要一個更簡單的hexDigits列表,如箭頭的答案中提到的"0123456789ABCDEF"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM