如何在haskell中解析字符串?

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

我对阿斯克尔不熟悉。

我必须执行此功能parseChar :: Char -> Parser Char

> parseChar 'a' " abcd "
Just ('a', "bcd")
> parseChar 'z' " abcd "
Nothing

我做了这个功能

type Parser r = String -> Maybe (Char, String)
parseChar :: Char -> Parser Char
parseChar x = \xs -> Just(x, xs)

我不太明白 \ 以及如何获取除第二个字符串之外的所有字符串。

谢谢!!

parsing haskell
1个回答
1
投票

我不太明白

\
以及如何获取除第二个之外的所有字符串。

\
是一个 lambda 表达式
\xs -> …
是将变量
xs
映射到
部分的函数。然而,在这里您可以将变量移动到子句的头部。

但是,您需要检查字符串的第一个元素是否确实是您正在解析的元素:

parseChar :: Char -> Parser Char
parseChar _ "" = Nothing
parseChar x (y:ys)
    | x == y = Just (y, ys)
    | otherwise = Nothing

这里

x
是我们要解析的字符,
""
(y:ys)
是我们正在解析的字符串。
""
表示字符串为空,在这种情况下我们返回
Nothing
。如果字符串不为空,我们将其解压到第一个字符 (head)
y
,以及剩余字符列表 (tail)
ys
。在情况
x == y
中,我们正在解析正确的字符,并且我们可以返回包装在
Just
构造函数中的 2 元组。如果
x
不等于
y
,解析器应该“失败”并返回
Nothing

然后得出:

Prelude> parseChar 'a' "abcd"
Just ('a',"bcd")
Prelude> parseChar 'z' "abcd"
Nothing
Prelude> parseChar 'a' ""
Nothing
© www.soinside.com 2019 - 2024. All rights reserved.