web-dev-qa-db-ja.com

HaskellのPrelude.readがMaybeを返さないのはなぜですか?

Prelude.readのタイプが正しい理由はありますか

read :: Read a => String -> a

Maybe値を返すのではなく?

read :: Read a => String -> Maybe a

文字列は解析可能なHaskellに失敗するかもしれないので、後者はより自然ではないでしょうか?

またはEither String a、ここでLeftは、解析されなかった場合は元の文字列を含み、Rightは解析された場合の結果を含みますか?

編集:

私は他の人に対応するラッパーを書いてもらうつもりはありません。安全であるという安心感を求めているだけです。

101
Bilal Barakat

Edit:GHC 7.6以降、readMaybeText.ReadモジュールとreadEither :: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v :readMaybe


いい質問です!読み取りの種類自体は、多くのことを壊してしまうため、すぐには変わりません。ただし、shouldmaybeRead関数が必要です。

なぜないのですか?答えは「慣性」です。 '08年の議論 がありましたが、これは「失敗」をめぐる議論によって脱線しました。

良いニュースは、人々が図書館で失敗から脱却し始めることを十分に確信していたことです。悪いニュースは、提案がシャッフルで失われたことです。このような関数はあるはずです。ただし、簡単に記述できます(そして、多くのコードベースに無数の非常に類似したバージョンがあります)。

この説明 も参照してください。

個人的には、 safe package のバージョンを使用しています。

99
sclv

ええ、Maybeを返す読み取り関数があれば便利です。自分で作ることができます:

readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing
29
augustss

慣性や洞察の変化は別として、別の理由は、showの一種の逆関数として機能できる関数を持っていることが審美的に楽しいことです。つまり、read . showがID(ShowおよびReadのインスタンスである型の場合)であり、show . readが範囲のIDであることが必要です。 show(つまりshow . read . show == show

Maybeのタイプにreadがあると、show :: a -> Stringとの対称性が崩れます。

14
yatima2975

@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
11
lpsmith

この関数( readMaybe と呼ばれる)は、Haskellプレリュードにあります! (現在のベース-4.6)

7
amindfv