2012-03-08 81 views
0

我只是在這裏問一個簡單的問題。我試圖將撲克牌排名編碼爲4位二進制代碼(實例2是0010,7是0111)(現在忽略了這些套裝)。然後解碼並打印出來。爲什麼顯示0001不返回「0001」?

據我所知,將Int更改爲String的最佳方法是使用show函數。但是,在這種情況下使用它會丟棄1之前的所有0(exp。show 0011返回「11」,show 0001返回「1」)。我如何保持零?

感謝

回答

3

對我來說,好像你要轉換成整數,而不是字節 整數是實數,所以零被刪除。

保留零必須保持數據爲一個字符串或創建一個字節數組,如果它轉換爲一個整數的零被刪除。

+1

或者,您可以使用自定義的Int-> String轉換函數將字符串填充到適當的數字位數,例如,如果你總是需要4位數字,'1'會顯示爲'0001','32'會顯示爲'0032'。 ['Text.Printf'](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Printf.html)可能是正確的工具。 – 2012-03-08 00:35:32

1

0011不是3的二進制表示,這是連續十一些零填充的十進制數。由於除了進行一些操作外,我沒有看到用二進制數表示卡片的任何理由,所以應該小心這個錯誤。

如果你真的想與你的電話號碼的二進制表示的工作,你應該寫一個轉換功能:

stringToBin :: String -> Int  
stringToBin xs 
    | all (`elem` "01") xs = foldl' (\acc b -> 2 * acc + digitToInt b) 0 xs 
    | otherwise = error (xs ++ " is not a binary string") 

bin = stringToBin 
sample = bin"0011" 
check = sample == 3 

,並提出他們的另一個功能,與printf的墊的結果和unfoldr和反向生成數字列表。

但是你確定要使用這種編碼嗎?更符號的方法通常更易於使用。

data Card = Card Value Suit deriving (Eq, Ord, Show, Read) 
data Value = N Int | J | Q | K | A deriving (Eq, Ord, Show, Read) 
data Suit = ... 


編輯:我忘了數字模塊(自帶GHC)具有showIntAtBase功能和的readInt:

stringToBin = fst . head . readInt 2 (`elem` "01") digitToInt 
binToString n = showIntAtBase 2 intToDigit n "" 

雖然它仍然不會爲你做填充。

+0

感謝您的文章,您可能會說這不是表示卡片的好方法。我只是在探索如何去做。我發現這個問題很有趣,並且想更多地理解它。 感謝大家有投入,我會給它一切。 – HHC 2012-03-09 06:51:29

相關問題