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")]