数値(Numeric):読み込み関数

The Haskell 98 Report 14 数値 14.2 読み込み関数

  • lexDigits :: ReadS String は 10 進数の空ではない文字列を読み込む。
> :m + Numeric
> :t lexDigits              --=> lexDigits :: String -> [(String, String)]
> lexDigits "12345"         --=> [("12345","")]
> lexDigits "12345abcde"    --=> [("12345","abcde")]
> lexDigits "xyz12345abcde" --=> []
  • readDec, readOct, readHex :: (Integral a) => ReadS a は、それぞれ、10 進、8 進、16 進記法の符号の付かない数値を読み込む。 16 進の場合には、大文字、小文字のどちらでもよい。
> :t readDec      --=> readDec :: (Num a) => String -> [(a, String)]
> readDec "12345" --=> [(12345,"")]
> let dec=readDec "12345"
> :t dec          --=> dec :: [(Integer, String)]

> :t readOct      --=> readOct :: (Num a) => String -> [(a, String)]
> readOct "777"   --=> [(511,"")]
> let oct = readOct "777"
> :t oct          --=> oct :: [(Integer, String)]

> :t readHex      --=> readHex :: (Num a) => String -> [(a, String)]
> readHex "aaff"  --=> [(43775,"")]
> readHex "ffff"  --=> [(65535,"")]
> let hex = readHex "ffff"
> :t hex          --=> hex :: [(Integer, String)]
  • readFloat :: (RealFrac a) => ReadS a は、科学記法で表現された符号の付かない RealFrac クラスの値を読み込む。
> :t readFloat        --=> readFloat :: (RealFrac a) => String -> [(a, String)]
> readFloat "123.45"  --=> [(123.45,"")]
> let n = readFloat "123.45"
> :t n                --=> n :: [(Double, String)]
  • readInt :: (Integral a) => a -> (Char->Bool) -> (Char->Int) -> ReadS a は、符号の付かない Integral クラスの値を任意の 基数で読み込む。(readInt base isdig d2i) の 呼び出しにおいて、base は基数であり、isdig はその 基数として正当な数字であるかどうかを判定する述語である。また、 d2i は正当な数字を Int へ変換する。
> :t readInt 
readInt
  :: (Num a) =>
     a -> (Char -> Bool) -> (Char -> Int) -> String -> [(a, String)]

> readInt 10 isDigit  digitToInt "12345"              --=> [(12345,"")]
> readInt 8  isDigit  digitToInt "12345"              --=> [(5349,"")]
> readInt 2 (\x->x=='0' || x=='1')  digitToInt "101"  --=> [(5,"")]
> readInt 2 (\x->x=='0' || x=='1')  digitToInt "1111" --=> [(15,"")]
> readInt 16 isHexDigit  digitToInt "ffff"            --=> [(65535,"")]
  • readSigned :: (Real a) => ReadS a -> ReadS a は、符号の付かない値用の読み込み関数を与えられると、 符号付きの Real クラスの値を読み込む。
> readSigned  readFloat "-123.45"   --=> [(-123.45,"")]
> readSigned  readFloat "123.45"    --=> [(123.45,"")]

出力がタプルなのは理解できるが、何故それをリストで包んでいるのだろう?

  • 追記:2011/08/03

こちらのサイトにリストで包んでいる理由を説明していただきました。
あぁ・・・なんとなくわかった気がする・・・変換に失敗したときに、空リストを返してもらった方がうれしいからかな? 」。
そうですね、失敗したとき返すものがなくてはなりません。
そうじゃなかったら、Maybe 型にして、成功したら Just (123.45,"")、失敗したら Nothing とか・・・。