该标准哈斯克尔类页说以下有关reads :: (Read a) => String -> [(a,String)]
:
通常,解析器返回单个列表,其中包含从输入字符串中读取的类型a的值以及在解析后的字符串.但是,如果无法解析,则结果为空列表,如果存在多个可能的解析(歧义),则结果列表包含多个对.
在什么情况或例子中这种模糊性表现出来了?
import Text.Read
data Foo = Bar Int | Baz Double deriving Show
instance Read Foo where
readPrec = fmap Bar readPrec +++ fmap Baz readPrec
Run Code Online (Sandbox Code Playgroud)
在此示例中,解析器尝试解析Int
和Double
。如果可以解析两者,则解析器返回两个值。
导致:
> read "4" :: Foo
*** Exception: Prelude.read: ambiguous parse
Run Code Online (Sandbox Code Playgroud)
和
> reads "4" :: [(Foo,String)]
[(Bar 4,""),(Baz 4.0,"")]
Run Code Online (Sandbox Code Playgroud)
解决歧义的最简单方法是通过将选择运算符+++
替换为选择性选择<++
来选择一个解析。
归档时间: |
|
查看次数: |
140 次 |
最近记录: |