我正在尝试为数据Person( data Person
)编写解析器 . 但我必须使用 <$>
和 <*>
在一行中编写它并且我尝试了很多,但我真的得到"overtaxed" .
解析器类型与往常一样:
newtype Parser a = Parser (String -> [(a,String)])
我有这个功能:
parse :: Parser a -> String -> Maybe a
返回第一个完整的解析 .
e.g.
如果我有这个简单的功能:
upper :: Parser Char
upper = satisfy isUpper
如果我运行 parse upper "A"
我得 Just 'A'
我也有这样一个有趣的功能:
name :: Parser String
name = (:) <$> (satisfy isUpper) <*> (many $ satisfy isAlpha)
正如您所看到的,它接受所有字符串的字符串并以上部字母开头 .
所以:
*Main> parse name1 "hello"
Nothing
*Main> parse name1 "Hello"
Just "Hello"
到现在为止一切都很好,唯一的问题是我必须为类做类似的事情(数据,类型?!)人( data Person
)
所以,我有这个:
data Person = Person String deriving (Eq, Show)
然后,在一行中,我必须为 Person
编写解析器,但名称应该满足函数 name
,这意味着,名称应该只是一个文字字符串,其中第一个是大写字母 .
它应该工作如下:
> parse parserPerson "Chuck"
Just (Person "Chuck")
> parse parserPerson "chuck"
Nothing
哪里:
parserPerson :: Parser Person
parserPerson = ???
正如你所看到的,bevor "Chuck"有 Person
,所以我不得不以某种方式 *>
来获取它 .
就是这样,只有一条 <$>
, <*>
和 *>
就行了 .
我没有线索,我对此感到疯狂 . 也许有人可以帮助我 .
EDIT
satisfy :: (Char -> Bool) -> Parser Char -- parse a desired character
satisfy p = Parser check
where
check (c:s) | p c = [(c,s)] -- successful
check _ = [ ] -- no parse
和 many
(如 some
)是 Control.Applicative
Control.Applicative的功能
1 回答
正如tsorn所说,答案很简单......
它的工作原理是因为定义了Functor Instacnce .