页面说明了以下reads :: (Read a) => String -> [(a,String)]
:
通常,解析器返回单个列表,其值为 输入从输入字符串和剩余字符串中读取的a 在解析之后。但是,如果没有可能的解析,那么 结果是空列表,如果有多个可能的解析 (歧义),结果列表包含多个对。
这种歧义在什么情况或例子中表现出来?
答案 0 :(得分:3)
import Text.Read
data Foo = Bar Int | Baz Double deriving Show
instance Read Foo where
readPrec = fmap Bar readPrec +++ fmap Baz readPrec
在此示例中,解析器尝试解析Int
和Double
。如果可以为两者解析,则解析器返回两个值。
导致:
> read "4" :: Foo
*** Exception: Prelude.read: ambiguous parse
和
> reads "4" :: [(Foo,String)]
[(Bar 4,""),(Baz 4.0,"")]
此处修复歧义的最简单方法是通过将choice operator +++
替换为selective choice <++
来选择一个解析。