#string #parsing #haskell #character #point
#строка #синтаксический анализ #haskell #символ #точка
Вопрос:
Я пытаюсь проанализировать строки формата:
(x,y) (r,g,b)
Мой файл содержит такую строку в каждой строке.
Я уже извлек строки, теперь я хочу извлечь их значения, но я не смог найти что-то удовлетворяющее.
Я хотел сделать что-то вроде :
case str of
['(', x, ',', y, ')', ' ', '(', r, ',', g, ',', b, ')'] -> The rest
Я знаю, что это не работает, я новичок в Haskell, поэтому я продолжаю сталкиваться с ошибками, которые я не понимаю.
Как я могу это сделать?
РЕДАКТИРОВАТЬ: я создавал это раньше, но я не знаю, как действительно использовать его после создания переменной :
data Points = Point Coords Colors
data Colors = Color Float Float Float
data Coords = Coord Int Int
Числа не ограничены одной цифрой, r, g и b варьируются от 0 до 255.
Комментарии:
1. Возможно, вы захотите прочитать о анализаторах, особенно о
parsec
библиотеке.
Ответ №1:
Простой взлом для этой конкретной задачи:
data Pix = Pix (Int,Int) (Int,Int,Int)
deriving (Read, Show)
parsePix :: ReadS Pix
parsePix s = reads $ "Pix " s
*Main> parsePix "(1,2) (3,4,5)"[(Pix (1,2) (3,4,5),"")]
В общем, вам следует изучить надлежащие библиотеки синтаксического анализатора-комбинатора, хотя я рекомендую megaparsec.
Комментарии:
1. Спасибо. Как я могу вернуть пикс вместо его печати и как мне прочитать его значения обратно после создания Пикс? РЕДАКТИРОВАТЬ: я на самом деле не совсем понимаю. Создает ли эта функция Пикс? Что такое чтение?
2. LMHTFY . По сути, результатом
ReadS
является список, который либо содержит один допустимый проанализированный элемент, либо ничего (если анализатор не сработал).3. Итак, первый элемент возвращаемого значения — это Пикс ?
4. ДА. Другой — это просто оставшаяся часть строки (если таковая имеется).
5. Как и в случае с любым другим списком: путем сопоставления с образцом,
case ... of ((Pix pt color, _):_) -> ...
, или вы можете сложить его, илиmapM_
поверх него, и т.д. и т.п..