Haskell 为什么show 0001不返回;0001";?

Haskell 为什么show 0001不返回;0001";?,haskell,Haskell,我只是问一个简单的问题。我正在尝试将扑克卡排名编码为4位二进制代码(exp.2是0010,7是0111)(暂时忽略诉讼)。然后解码并打印出来 据我所知,将Int转换为字符串的最佳方法是使用函数show。但是,在这种情况下使用它会删除1前面的所有零(例如show 0011返回“11”,show 0001返回“1”)。如何保持零 谢谢对我来说,你似乎在把它转换成整数而不是字节 整数是实数,所以零被删除 要保留零,必须将数据保留为字符串或创建字节数组,如果将其转换为整数,则删除零。因为0001是一个数

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

据我所知,将Int转换为字符串的最佳方法是使用函数show。但是,在这种情况下使用它会删除1前面的所有零(例如show 0011返回“11”,show 0001返回“1”)。如何保持零


谢谢

对我来说,你似乎在把它转换成整数而不是字节 整数是实数,所以零被删除


要保留零,必须将数据保留为字符串或创建字节数组,如果将其转换为整数,则删除零。

因为0001是一个数字,而不是字符串。0001读取语法转换为整数对象,当您打印该整数对象时,它以十进制形式打印为1

1是0的继承者。1中没有零。:)

要将1打印为0001,请尝试提供printf的前奏曲:

例如


0011不是3的二进制表示,它是11的十进制数,加上一些零。因为除了执行一些位操作之外,我看不出有任何理由用二进制数表示卡,所以您应该小心那个错误

如果您确实想使用数字的二进制表示形式,则应编写一个转换函数:

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 = ...

编辑:我忘了数字模块(随GHC提供)有一个ShowIntBase函数和一个readInt:

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

尽管它仍然不能为您进行填充。

或者,您可以使用自定义的Int->String转换函数,将字符串填充到适当的位数,例如,如果您总是需要4位数字,
1
将显示为
0001
32
将显示为
0032
。这可能是正确的工具。谢谢你的帖子,你可能会说这不是一个好的表示卡片的方法。我只是在想办法。我发现这个问题很有趣,我想了解更多。感谢所有有意见的人,我会全力以赴。