readHex
戻り値の型に関して
readHex の戻り値の型がなぜ [(a, String)] になっているのだろう、(a, String) でいいのでは、と思った。
ghci> :m Numeric ghci> :t readHex readHex :: (Num a) => String -> [(a, String)] ghci> readHex "7dbZYX" [(2011,"ZYX")] ghci> readHex "@7dbZYX" []
成功した場合と失敗した場合とをわけるためなんだろう、と試しているうちに気がついた。
でも、そういうときのために Maybe があるのでは、とも思った。どのようなときに Maybe が有用で、どのようなときにそうでないのか、まだ理解していない。
シノニム
調べたら、[(a, String)] は ReadS という別名があるとのこと。
type ReadS = String -> [(a,String)]
変換可能文字列
16進数の場合数値の先頭に "0x" を付けることがあるが、readHex は先頭の "0x" は変換可能文字列として認識しない。
ghci> readHex "0x1f" [(0,"x1f")]
どちらかと言えば、"0x"が付いていても変換して欲しい。実装するとしたらこんな感じだろうか。
readHex' :: (Num a) => String -> [(a, String)] readHex' ('0':'x':xs) = readHex xs readHex' xs = readHex xs
ghci> readHex' "0x7dbZYX" [(2011,"ZYX")] ghci> readHex' "7dbZYX" [(2011,"ZYX")] ghci> readHex' "0xZYX" [] ghci> readHex' "0ZYX" [(0,"ZYX")]