Как разобрать целые числа из строки в Haskell

#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_ поверх него, и т.д. и т.п..