为什么Haskell的Prelude.read没有返回一个Maybe?
为什么Prelude.read的types有一个很好的理由
read :: Read a => String -> a
而不是返回一个Maybe
值?
read :: Read a => String -> Maybe a
由于string可能无法parsingHaskell,后者会不会更自然?
或者甚至是一个Either String a
,其中Left
将包含原始string,如果它没有parsing,并且Right
的结果,如果它?
编辑:
我不想让别人为我写一个相应的包装。 只是为了保证这样做是安全的。
编辑 :从GHC 7.6开始, readMaybe
可以在基本的Text.Read
库中使用,也可以使用readEither
: http : readEither
·V:readMaybe
好问题! 阅读本身的types不会很快改变,因为这会破坏很多东西。 但是, 应该有一个maybeRead
函数。
为什么不在那里? 答案是“惯性”。 在08年的讨论中 ,由于“失败”的讨论而出轨。
好消息是,人们有足够的信心开始摆脱图书馆的失败。 坏消息是这个提案在混乱中迷失了方向。 应该有这样一个function,虽然很容易编写(而且在很多代码库中都有非常相似的版本)。
另见这个讨论 。
我个人使用安全包的版本。
是的,这将是一个阅读函数返回Maybe可能很方便。 你可以自己做一个:
readMaybe :: (Read a) => String -> Maybe a readMaybe s = case reads s of [(x, "")] -> Just x _ -> Nothing
除了惯性和/或变化的见解之外,另一个原因可能是在美学上令人愉悦的是具有可以作为表演的反面的function。 那就是你想要read . show
read . show
是身份(对于Show
和Read
的实例types)和show . read
show . read
是show
范围上的标识(即show . read . show == show
)
在read
types中使用Maybe
read
打破show :: a -> String
的对称性。
正如@augustss指出的那样,你可以使自己的安全阅读function。 然而,他的readMaybe
与read不完全一致,因为它不会忽略string末尾的空格。 (我犯过一次这个错误,我不太清楚上下文)
查看Haskell 98报告中的读取定义 ,我们可以对其进行修改以实现与read
完全一致的readMaybe
,这不是太麻烦,因为它所依赖的所有函数都是在Prelude中定义的:
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)