gpt4 book ai didi

haskell - 如何用 Parsec 读取精确的 N 个字符?

转载 作者:行者123 更新时间:2023-12-04 13:27:54 24 4
gpt4 key购买 nike

我是 Haskell 和 Parsec 的新手。
我希望解析字符串 's:numb:"string";' 的 php-serialize 格式喜欢

s:12:"123";6789012";

其中 number 是字符数。
所以,函数看起来像:

newtype PhpString = PhpString String

pString :: GenParser Char st PhpString
pString = do { string "s:"
; value1 <- many1 digit
; string ":\""
; value2 <- takeExactNChars (read value1)
; string "\";"
; return $ PhpString value2
}
where
takeExactNChars n = ???????

最佳答案

正如莎拉所说,惯用的 parsec解决方案是使用 count组合器:

newtype PhpString = PhpString String

pString :: Parser PhpString
pString = do
string "s:"
value1 <- many1 digit
string ":\""
value2 <- count (read value1)
string "\";"
return $ PhpString value2

如果您对此感兴趣,我们可以更进一步并清理这个解析器以使其更简洁:
import Control.Applicative (empty)
import Text.Read

pString :: Parser PhpString
pString = do
len <- readMaybe <$> (string "s:" *> many1 digit)
case len of
Just n -> PhpString <$> string ":\"" *> count n anyChar <* string "\";"
Nothing -> empty

或者甚至:
pString :: Parser PhpString
pString =
readMaybe <$> (string "s:" *> many1 digit) >>=
maybe empty $ \n ->
PhpString <$> string ":\"" *> count n anyChar <* string "\";"
empty来自 Control.Alternative解析器失败,以防 read失败。

关于haskell - 如何用 Parsec 读取精确的 N 个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15474016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com