Haskell解析递归和也许

问题描述 投票:2回答:1

我正在尝试在Haskell中编写解析器。

此解析器在参数中使用字符串(例如:“ abc def”)并返回Maybe(字符串,字符串)。

也许(字符串,字符串)

第一个字符串获取数字或字母的字符。

第二个字符串得到其余的

在此示例中,我想返回Maybe(“ abc”,“ def”)。

parseString :: String -> Maybe (String, String)
parseString "" = Nothing
parseString expr = case isString expr of
                Just (char, rest) -> fmap (char:) (parseString rest)
                Nothing -> Just ("", expr)

isString返回:

也许(字符,字符串)->字符=第一个字符,字符串=休息/如果不是字母或数字,则什么也不是。

问题,可能无法返回其余的String。

parsing haskell recursion functional-programming
1个回答
3
投票

问题似乎出在

fmap (char:) (parseString rest)

现在,(char:)是函数String -> String,因此fmap (char:)变为Maybe String -> Maybe String(或将其推广到另一个函子)。但是,parseString rest不是Maybe String,而是Maybe (String, String)

因此,我们需要调整(char:)以在该对的第一个组件上工作。我会尝试

fmap (\(res,rest2) -> (char:res, rest2)) (parseString rest)

((通过从firstData.Bifunctor导入Data.Bifunctor,可以将其写为Control.Arrow,但这并不重要。)

© www.soinside.com 2019 - 2024. All rights reserved.