Разбор пользовательского ввода с чтениями в Haskell - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь разобрать введенную пользователем строку, например "A12", в кортеж Хаскеля, например ('A', 12).

Вот что я пробовал:

import Data.Maybe

type Pos = (Char, Int)

parse :: String -> Maybe Pos
parse u = do
  (c, rest) <- (listToMaybe.reads) u
  (r, _) <- (listToMaybe.reads) rest
  return $ (c, r)

Но это всегда ничего не возвращает. Почему это происходит, и как правильно проанализировать эту строку? Поскольку это довольно просто, я бы хотел избежать использования Parsec или подобной расширенной библиотеки синтаксического анализа.

РЕДАКТИРОВАТЬ (уточнить): Пример ввода и вывода:

"A12" дает Just ('A', 12)

"J5" дает Just ('J', 5)

"A" дает Nothing

"2324" т Nothing

Ответы [ 2 ]

4 голосов
/ 01 апреля 2012

read обычно противоположно show, и они оба обычно используют синтаксис Haskell для представления заданных значений. Это означает, что поскольку в синтаксисе Haskell для символов используются одинарные кавычки, show для символа будет добавлять одинарные кавычки вокруг него, а read будет ожидать, что одинарные кавычки будут там.

Другими словами, ваша функция ожидает синтаксис, подобный 'A' 42, и действительно, если вы попытаетесь это сделать, это сработает:

> parse "'A' 42"
Just ('A',42)

Для вашего формата я бы вместо этого использовал сопоставление с шаблоном для первого символа, а затем reads для остальных, например. как то так:

parse :: String -> Maybe Pos
parse [] = Nothing
parse (c:rest) = do
  (r, _) <- listToMaybe $ reads rest
  return (c, r)
0 голосов
/ 01 апреля 2012

Нужно ли использовать do обозначение?Если нет, то следующая функция соответствует вашим потребностям.Это не красиво, но это делает работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...