何时可以使用读取进行模糊解析?

Ana*_*Ana 9 parsing haskell

标准哈斯克尔类页说以下有关reads :: (Read a) => String -> [(a,String)]:

通常,解析器返回单个列表,其中包含从输入字符串中读取的类型a的值以及在解析后的字符串.但是,如果无法解析,则结果为空列表,如果存在多个可能的解析(歧义),则结果列表包含多个对.

在什么情况或例子中这种模糊性表现出来了?

Vek*_*weg 4

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)

在此示例中,解析器尝试解析IntDouble。如果可以解析两者,则解析器返回两个值。

导致:

> 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)

解决歧义的最简单方法是通过将选择运算符+++替换为选择性选择<++来选择一个解析。