Bil*_*kat 103 parsing haskell types
Prelude.read的类型是否有充分的理由
read :: Read a => String -> a
Run Code Online (Sandbox Code Playgroud)
而不是返回一个Maybe值?
read :: Read a => String -> Maybe a
Run Code Online (Sandbox Code Playgroud)
由于字符串可能无法解析Haskell,后者不会更自然吗?
或者甚至是一个Either String a,Left如果没有解析的话会包含原始字符串,如果是的话会Right得到结果?
编辑:
我不是想让其他人为我写一个相应的包装器.只是寻求保证这样做是安全的.
scl*_*clv 102
编辑:自GHC 7.6起,readMaybe可在Text.Read基本软件包的模块中找到,以及readEither:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybe
好问题!读取本身的类型不会很快改变,因为这会破坏很多东西.但是,应该有一个maybeRead功能.
为什么不存在?答案是"惯性".有一个08年的讨论,其得到通过在讨论出轨"失败".
好消息是,人们已经足够信服开始摆脱图书馆的失败.坏消息是该提议在洗牌中丢失了.这里应该是这样的功能,但一个是容易写(并有漂浮的许多代码库非常类似的版本不计其数).
另见本讨论.
就个人而言,我使用的是安全包中的版本.
aug*_*tss 30
是的,使用返回Maybe的read函数会很方便.你可以自己做一个:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
Run Code Online (Sandbox Code Playgroud)
yat*_*975 15
除了惯性和/或改变的见解,另一个原因可能是,它的美观有可以作为一种反向的作用功能show.也就是说,你希望那read . show是标识(这是一个实例类型Show和Read),并且show . read是在范围内的身份show(即show . read . show == show)
具有断裂Maybe类型read的对称性show :: a -> String.
lps*_*ith 12
正如@augustss指出的那样,您可以自己进行安全读取功能.但是,他readMaybe与read不完全一致,因为它不会忽略字符串末尾的空格.(我犯过这个错误,我不太记得上下文)
在Haskell 98报告中查看read的定义,我们可以修改它以实现readMaybe与之完全一致的read,并且这不是太不方便,因为它依赖的所有函数都在Prelude中定义:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of
[x] -> Just x
_ -> Nothing
Run Code Online (Sandbox Code Playgroud)