【问题标题】:Haskell Parsing Recursion and MaybeHaskell 解析递归和可能
【发布时间】:2023-03-19 06:06:01
【问题描述】:

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

此解析器在参数中接受一个字符串(例如:“abc def”)并返回一个 Maybe (String, String)。

也许(字符串,字符串)

First String 获取数字或字母时的字符。

第二个字符串得到剩下的

在这个例子中,我想返回 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 返回:

也许 (Char, String) -> Char = 第一个字符,String = 其余 / 如果不是字母或数字,则什么都没有。

问题,我可能无法返回字符串的其余部分。

【问题讨论】:

    标签: parsing haskell recursion functional-programming


    【解决方案1】:

    问题似乎出在

    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)
    

    (通过从Data.BifunctorControl.Arrow导入first,可以写成fmap (first (char:)) (parseString rest),但这并不重要。)

    【讨论】:

    • 如果可以,char: 是什么?我看不懂冒号。
    • @Evgeny (expression symbol) 是一个section,是(\x -> expression symbol x) 的简写,所以(char:) 表示(\x -> char : x),该函数将char 添加到输入字符串x.
    • 哦,: 来自于列表构造器,是一种在列表头部前置的无点?感谢@chi 向我解释,这看起来像个谜。
    • @Evgeny 是的,它是列表构造函数之一(另一个是 [] 用于空列表)。
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2013-03-21
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2015-08-03
    相关资源
    最近更新 更多