古川制御日記

佐賀県武雄市の組み込み開発屋ブログ

ReadSを使って失敗を考慮したread

文字列をIntとして読み出したい場合には、

> read "123" :: Int
123

で良いですが、失敗する場合に面倒。

> read "one-two-three" :: Int
*** Exception: Prelude.read: no parse

文字列をIntとして読み出したい場合に失敗する可能性がある場合には

> let readi = reads :: ReadS Int

とInt読み出しに特化した関数を定義してやれば、

> readi "123"
[(123,"")]

こんなん返ってきます。

Intとしてread出来ない場合には、

> readi "one-two-three"
[]

空リストが返ってきます。

>:m Data.Maybe
> let readi = fmap fst . listToMaybe . reads :: String -> Maybe Int

定義すれば、成功時にJust Int,失敗時にNothingが返ってきます。

> readi "123"
Just 123
> readi "one-two-three"
Nothing

ここ参考にした。

かなりちまちまやってる感じ。
さらさら書けるようになりたい。

補足

> let readi = reads :: ReadS Int

この場合のreadiのシグネチャは、

> :t readi
readi :: ReadS Int

であるので、ぱっと見関数に見えません。
何ですかこれは。
一旦終わり。