49 votes

Pourquoi Haskell est-il incapable de lire "7e7" mais capable de lire "7a7"?

Essayer de faire:

 Prelude> reads "7a7" :: [(Int, String)]
[(7,"a7")]

Prelude> reads "7e7" :: [(Int, String)]
[]
 

J'ai testé cela pour tous les personnages possibles au milieu. Ils travaillent tous à l'exception de 'e' . Il semble que Haskell essaie d'interpréter le nombre en notation scientifique, mais cela ne peut pas, car je demande Int .

Cela ressemble à un bug pour moi.

44voto

R. Martinho Fernandes Points 96873

GHC est en effet buggy. Sa mise en œuvre d' Numeric.readSigned utilise les éléments suivants:

read'' r = do
    (str,s) <- lex r
    (n,"")  <- readPos str
    return (n,s)

L' lex appel d'essayer d'analyser tout lexeme, et cela signifie que pour "7e7" il rendements en [("7e7", "")], parce que "7e7" est un ensemble de lexeme pour un flottant littérale. Puis il essaie d'obtenir un parser d' readPos, ce qui dans ce cas est un argument pour qui Numeric.readDec a été transmis, et readDec du rendement de la volonté, correctement, [(7, "e7")] pour la chaîne "7e7". Qui ne pattern matching contre (n, ""), et finit [].

Je pense qu'il devrait être tout simplement comme suit:

read'' = readPos

2voto

David Young Points 4640

7e7 :: Fractional a => a , il ne peut donc pas être lu comme Int , mais comme Float ou Double .

 ghci> :t 7e7
7e7 :: Fractional a => a
 

0voto

Bobble Points 666

Quelle version de GHC utilisez-vous?

Voici le résultat (édité) d'une session de terminal sur mon installation:

 GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Prelude> reads "7a7" :: [(Int, String)]
[(7,"a7")]
Prelude> reads "7e7" :: [(Int, String)]
[(70000000,"")]
Prelude> 
 

Il y a une ambiguïté ici dans la façon d'interpréter l'entrée. D'habitude, j'imagine que l'interprétation de "7e7" comme un Int de 70000000 serait parfaitement acceptable. Comment le compilateur est-il censé savoir diviser la chaîne après le premier chiffre?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X