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

时间:2016-02-18 06:36:24

标签: parsing haskell

enter image description here页面说明了以下reads :: (Read a) => String -> [(a,String)]

  

通常,解析器返回单个列表,其值为   输入从输入字符串和剩余字符串中读取的a   在解析之后。但是,如果没有可能的解析,那么   结果是空列表,如果有多个可能的解析   (歧义),结果列表包含多个对。

这种歧义在什么情况或例子中表现出来?

1 个答案:

答案 0 :(得分:3)

import Text.Read

data Foo = Bar Int | Baz Double deriving Show

instance Read Foo where 
    readPrec = fmap Bar readPrec +++ fmap Baz readPrec

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

导致:

> read "4" :: Foo
*** Exception: Prelude.read: ambiguous parse

> reads "4" :: [(Foo,String)]
[(Bar 4,""),(Baz 4.0,"")]

此处修复歧义的最简单方法是通过将choice operator +++替换为selective choice <++来选择一个解析。