Quando pode haver uma análise ambígua usando leituras?

9

A página Classes padrão do Haskell diz o seguinte sobre reads :: (Read a) => String -> [(a,String)] :

  

Normalmente, um analisador retorna uma lista singleton, contendo um valor de   Digite um que foi lido a partir da string de entrada e a string restante   que segue o que foi analisado. Se nenhuma análise fosse possível, no entanto, o   O resultado é a lista vazia, e se houver mais de uma possível análise   (uma ambigüidade), a lista resultante contém mais de um par.

Em que situações ou exemplos essa ambiguidade se manifesta?

    
por Ana 18.02.2016 в 07:36
fonte

1 resposta

2
import Text.Read

data Foo = Bar Int | Baz Double deriving Show

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

Neste exemplo, o analisador tenta analisar Int e Double . Se puder ser analisado para ambos, o analisador retornará dois valores.

Como resultado:

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

e

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

A maneira mais fácil de corrigir ambigüidade é selecionar uma análise substituindo o operador de escolha +++ com o escolha seletiva <++ .

    
por Vektorweg 19.02.2016 / 02:44
fonte