2012-03-08 18 views
0

ここでは簡単な質問をしています。私はポーカーカードのランキングを4桁のバイナリコード(2は0010、7は0111)にコード化しようとしています(今はスーツを無視しています)。その後、デコードしてそれを印刷します。show 0001が "0001"を返さないのはなぜですか?

私の知る限り、IntをStringに変更する最良の方法は、関数showを使用することです。しかし、この状況でこれを使用すると、1の前にあるすべてのゼロが削除されます(show 0011が "11"を返し、0001が "1"を返します)。どのようにゼロを保つのですか?あなたは、整数ではなく、バイト 整数に変換されているようにそれはそう

私のおかげ

答えて

3

0001は数字であり、文字列ではないためです。 0001読み取る構文は、整数オブジェクトに変換し、その整数オブジェクトを印刷するとき、それはゼロが1 :)

ではありません0の後継である1

1として小数で印刷されています0001として1を印刷するには、printf関数を提供プレリュードを試してみてください。

例:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Printf.html

3

は実数であるので、ゼロが削除されます。

ゼロを保持するには、データを文字列として保持したり、バイト配列を作成したりする必要があります。整数に変換すると、ゼロが削除されます。

+1

また、カスタムのInt-> String変換関数を使用すると、文字列を適切な桁数に埋め込むことができます。常に4桁の数字が必要な場合は、「1」は「0001」と表示され、「32」は「0032」と表示されます。おそらくそのためのツールは['Text.Printf'](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Printf.html)でしょう。 –

1

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関数で、結果をそれ、別の関数を提示すると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 = ... 


EDIT:それはまだあなたのためにパディングを行うことはありませんけれども

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

:私は数値モジュール(GHCに付属しているが)showIntAtBase機能とのreadIntを持っていることを忘れてしまいました。

+0

あなたのポストをありがとう、それはカードを表現する良い方法ではないと言うことは正しいかもしれません。私はそれを行う方法を模索していました。そして、私はこの問題を面白く見て、もっと理解したかったのです。 入力いただいた皆様に感謝します。 – HHC

関連する問題