gpt4 book ai didi

在 Haskell 中将多行解析为列表列表

转载 作者:行者123 更新时间:2023-12-02 14:34:28 24 4
gpt4 key购买 nike

我正在尝试解析一个如下所示的文件:

a b c 
f e d

我想匹配行中的每个符号并将所有内容解析为列表列表,例如:

[[A, B, C], [D, E, F]]

为了做到这一点,我尝试了以下方法:

import           Control.Monad
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Language
import qualified Text.ParserCombinators.Parsec.Token as P

parserP :: Parser [[MyType]]
parserP = do
x <- rowP
xs <- many (newline >> rowP)
return (x : xs)

rowP :: Parser [MyType]
rowP = manyTill cellP $ void newline <|> eof

cellP :: Parser (Cell Color)
cellP = aP <|> bP <|> ... -- rest of the parsers, they all look very similar

aP :: Parser MyType
aP = symbol "a" >> return A

bP :: Parser MyType
bP = symbol "b" >> return B

lexer = P.makeTokenParser emptyDef
symbol = P.symbol lexer

但它无法返回多个内部列表。相反,我得到的是:

[[A, B, C, D, E, F]]

我做错了什么?我原本期望 ManyTill 解析 cellP 直到换行符,但事实并非如此。

最佳答案

解析器组合器对于这么简单的事情来说有点过分了。我会使用lines :: String -> [String]words :: String -> [String]分解输入,然后将各个标记映射到 MyType 中。

toMyType :: String -> Maybe MyType
toMyType "a" = Just A
toMyType "b" = Just B
toMyType "c" = Just C
toMyType _ = Nothing

parseMyType :: String -> Maybe [[MyType]]
parseMyType = traverse (traverse toMyType) . fmap words . lines

关于在 Haskell 中将多行解析为列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44834764/

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