我只是在這裏問一個簡單的問題。我試圖將撲克牌排名編碼爲4位二進制代碼(實例2是0010,7是0111)(現在忽略了這些套裝)。然後解碼並打印出來。爲什麼顯示0001不返回「0001」?
據我所知,將Int更改爲String的最佳方法是使用show函數。但是,在這種情況下使用它會丟棄1之前的所有0(exp。show 0011返回「11」,show 0001返回「1」)。我如何保持零?
感謝
我只是在這裏問一個簡單的問題。我試圖將撲克牌排名編碼爲4位二進制代碼(實例2是0010,7是0111)(現在忽略了這些套裝)。然後解碼並打印出來。爲什麼顯示0001不返回「0001」?
據我所知,將Int更改爲String的最佳方法是使用show函數。但是,在這種情況下使用它會丟棄1之前的所有0(exp。show 0011返回「11」,show 0001返回「1」)。我如何保持零?
感謝
因爲0001是一個數字,而不是一個字符串。 0001讀語法被轉換成整數對象,並且當打印整數對象,它在十進制打印爲1
1的後繼0沒有零點在1 :)
要打印1爲0001,嘗試提供printf的前奏:
如
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Printf.html
對我來說,好像你要轉換成整數,而不是字節 整數是實數,所以零被刪除。
保留零必須保持數據爲一個字符串或創建一個字節數組,如果它轉換爲一個整數的零被刪除。
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 = ...
stringToBin = fst . head . readInt 2 (`elem` "01") digitToInt
binToString n = showIntAtBase 2 intToDigit n ""
雖然它仍然不會爲你做填充。
感謝您的文章,您可能會說這不是表示卡片的好方法。我只是在探索如何去做。我發現這個問題很有趣,並且想更多地理解它。 感謝大家有投入,我會給它一切。 – HHC 2012-03-09 06:51:29
或者,您可以使用自定義的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