我只是在这里问一个简单的问题。我正在尝试将扑克牌排名编码为4位二进制代码(exp.2是0010,7是0111)(现在忽略了套装)。然后解码并打印出来。
据我所知,将Int更改为String的最佳方法是使用show函数。但是,在这种情况下使用它会丢弃1前面的所有零(exp。显示0011返回“11”,show 0001返回“1”)。我如何保留零?
由于
答案 0 :(得分:3)
对我来说,好像你把它转换成整数而不是字节 整数是实数,因此删除了零。
保持零必须将数据保存为字符串或创建一个字节数组,如果将其转换为整数,则零被删除。
答案 1 :(得分:3)
因为0001是一个数字,而不是一个字符串。 0001读取语法被转换为整数对象,当您打印该整数对象时,它以十进制打印为1。
1是0的后继.1:1中没有零。
要将1打印为0001,请尝试提供printf的前奏:
E.g
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Printf.html
答案 2 :(得分: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用于填充结果并展开并反向生成数字列表。
但你确定要使用这种编码吗?更具象征性的方法通常更容易使用。
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 = ...
<小时/> 编辑:我忘记了Numeric模块(GHC附带)有一个showIntAtBase函数和一个readInt:
stringToBin = fst . head . readInt 2 (`elem` "01") digitToInt
binToString n = showIntAtBase 2 intToDigit n ""
虽然它仍然不会为你做填充。