Prelude.readのタイプが正しい理由はありますか
read :: Read a => String -> a
Maybe
値を返すのではなく?
read :: Read a => String -> Maybe a
文字列は解析可能なHaskellに失敗するかもしれないので、後者はより自然ではないでしょうか?
またはEither String a
、ここでLeft
は、解析されなかった場合は元の文字列を含み、Right
は解析された場合の結果を含みますか?
編集:
私は他の人に対応するラッパーを書いてもらうつもりはありません。安全であるという安心感を求めているだけです。
Edit:GHC 7.6以降、readMaybe
はText.Read
モジュールとreadEither
:: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v :readMaybe
いい質問です!読み取りの種類自体は、多くのことを壊してしまうため、すぐには変わりません。ただし、shouldmaybeRead
関数が必要です。
なぜないのですか?答えは「慣性」です。 '08年の議論 がありましたが、これは「失敗」をめぐる議論によって脱線しました。
良いニュースは、人々が図書館で失敗から脱却し始めることを十分に確信していたことです。悪いニュースは、提案がシャッフルで失われたことです。このような関数はあるはずです。ただし、簡単に記述できます(そして、多くのコードベースに無数の非常に類似したバージョンがあります)。
この説明 も参照してください。
個人的には、 safe package のバージョンを使用しています。
ええ、Maybeを返す読み取り関数があれば便利です。自分で作ることができます:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
慣性や洞察の変化は別として、別の理由は、show
の一種の逆関数として機能できる関数を持っていることが審美的に楽しいことです。つまり、read . show
がID(Show
およびRead
のインスタンスである型の場合)であり、show . read
が範囲のIDであることが必要です。 show
(つまりshow . read . show == show
)
Maybe
のタイプにread
があると、show :: a -> String
との対称性が崩れます。
@augustssが指摘したように、独自の安全な読み取り関数を作成できます。ただし、彼のreadMaybe
は、文字列の末尾の空白を無視しないため、読み取りと完全に一貫していません。 (私は一度この間違いを犯しましたが、文脈をよく覚えていません)
Haskell 98レポートの読み取りの定義 を見ると、readMaybe
と完全に一致するread
を実装するように変更できます。これはそれほど不便ではありません依存するすべての機能がプレリュードで定義されているためです。
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case [x | (x,t) <- reads s, ("","") <- Lex t] of
[x] -> Just x
_ -> Nothing
この関数( readMaybe
と呼ばれる)は、Haskellプレリュードにあります! (現在のベース-4.6)