在学习 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
monad 来简化。
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
有没有办法将这两种表达方式合二为一?相同的提升技术不适用于modifyState :: Monad m -> (u -> u) -> ParsecT s u m ()
.