Работа с ошибкой чтения без разбора для списков - PullRequest
0 голосов
/ 13 сентября 2018

Здравствуйте, может кто-нибудь объяснить, пожалуйста, как вы можете справиться с ошибочными вычислениями (в нашем случае с синтаксическим анализом) в Haskell при выполнении в списке, извлекая успешные элементы?

Я получаю ошибку
main: Prelude.read: no parse и это останавливает обработку всего списка

Я использую forM для коллекции Text, и для каждого элемента я использую
read::String->Double для значения результата.

В настоящее время синтаксический анализ не выполняется для первого элемента, и я не могу разобрать оставшиеся элементы. Как я могу сделать отдельные элементы "отказоустойчивыми", но все же получить частичные результаты (для элементов списка, которые могут быть проанализированы)?

Пример :
Ввод : ["asta","1.23","2.44"]
Желаемый выход : [1.23,2.44]

import qualified Data.Text as T

parseDfile::[T.Text]->IO [Maybe Double]
    parseDfile []=do
        return  [Nothing]
    parseDfile lines = forM lines $ \line ->
                          do   
                          Prelude.putStrLn ("line value:"++(T.unpack line))
                          let value = (read::String->Double) . T.unpack $ //fails here  for first element 
                          print .show $ value
                          return (Just value)

P.S
Должен ли я определять метод, используя монаду Maybe отдельно только для этой одной строки кода?

1 Ответ

0 голосов
/ 13 сентября 2018

Библиотека Text.Read также имеет функцию с именем readMaybe, которая возвращает Maybe a вместо a, как read.

В случае, если вы не уверены, может ли быть проанализирована строка, вам явно требуется Maybe a. Теперь вам нужно разобраться с Maybe, однако у монады Maybe есть тонны функций, которые выполняют именно то, что вам нужно.

Для более сложного анализа вы можете посмотреть на Haskell ParseLib, который действительно хорош. Однако это может быть немного излишним, если вы не пытаетесь анализировать больше, чем ваш пример.

...