我正在尝试在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。
问题似乎出在
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)
((通过从first
或Data.Bifunctor
导入Data.Bifunctor
,可以将其写为Control.Arrow
,但这并不重要。)