我对阿斯克尔不熟悉。
我必须执行此功能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)
我不太明白 \ 以及如何获取除第二个字符串之外的所有字符串。
谢谢!!
我不太明白
以及如何获取除第二个之外的所有字符串。\
\
是一个 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