Parsec を学習する中で、次のようなやや冗長なルールがあることがわかりました。
type PhonemeClassMap = Map Char String
type ContextElement = Parser String
phonemeContext :: Parsec String PhonemeClassMap ContextElement
phonemeContext = do
c <- lower
return $ char c
/モナドchar
のような関数を持ち上げることで単純化できます。Parsec
ParsecT
phonemeContext :: Parsec String PhonemeClassMap ContextElement
phonemeContext = liftM char lower
今、ユーザーの状態を変更するルールを単純化しようとしています:
import Data.Map (insert)
phonemeClassDefinition :: Parsec String PhonemeClassMap ()
phonemeClassDefinition = do
upperChar <- upper
lowerChars <- char ':' >> spaces >> many1 lower
modifyState (insert upperChar lowerChars)
簡単に持ち上げinsert :: Char -> String -> PhonemeClassMap -> PhonemeClassMap
て、次の改善を行うことができます。
phonemeClassDefinition = do
f <- liftM2 insert upper (char ':' >> spaces >> many1 lower)
modifyState f
この 2 つの式を 1 つにまとめる方法はありますか? 同じリフティング テクニックは には機能しませんmodifyState :: Monad m -> (u -> u) -> ParsecT s u m ()
。