为什么show 0001没有返回“0001”?

时间:2012-03-08 00:30:09

标签: haskell

我只是在这里问一个简单的问题。我正在尝试将扑克牌排名编码为4位二进制代码(exp.2是0010,7是0111)(现在忽略了套装)。然后解码并打印出来。

据我所知,将Int更改为String的最佳方法是使用show函数。但是,在这种情况下使用它会丢弃1前面的所有零(exp。显示0011返回“11”,show 0001返回“1”)。我如何保留零?

由于

3 个答案:

答案 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 ""

虽然它仍然不会为你做填充。