Я новичок в Haskell, использую Attoparsec для поиска цветовых выражений в тексте. Я хочу иметь возможность сопоставлять, например, «светло-синий-зеленый» и «светло-синий-зеленый» в тексте. Но, конечно, мне нужно обобщенное решение для любой такой строки. Так что я думал, что это будет что-то вроде
"light" >> sep >> "blue" >> sep >> "green"
where sep = inClass "\n\r- "
Другими словами, я думаю, мне нужен способ вставки >> sep >>
в список слов. Что-то типа:
import qualified Data.Text as T
import Data.Attoparsec.Text
-- | Makes a parser from a list of words, accepting
-- spaces, newlines, and hyphens as separators.
wordListParser :: [T.Text] -> Parser
wordListParser wordList = -- Some magic here
Или, может быть, я думаю об этом совершенно неправильно, и есть более простой способ?
Изменить: этот минимальный нерабочий пример кажется почти готовым:
{-# LANGUAGE OverloadedStrings #-}
import Replace.Attoparsec.Text
import Data.Attoparsec.Text as AT
import qualified Data.Text as T
import Control.Applicative (empty)
wordListParser :: [T.Text] -> Parser T.Text
wordListParser (w:ws) = string w >> satisfy (inClass " -") >> wordListParser ws
wordListParser [w] = string w
wordListParser [] = empty -- or whatever the empty parser is
main :: IO ()
main = parseTest (wordListParser (T.words "light green blue")) "light green-blue"
который, я думаю, можно запустить с чем-то вроде
stack runhaskell ThisFile.hs --package attoparsec replace-attoparsec text
light blue-green
? - person chepner   schedule 06.02.2020sepBy1
иchoice
. - person chepner   schedule 06.02.2020sepBy1
? - person Jonathan   schedule 06.02.2020