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