首页 文章

在haskell中为Persons编写解析器

提问于
浏览
2

我正在尝试为数据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 回答

  • 1

    正如tsorn所说,答案很简单......

    parserPerson :: Parser Person
    parserPerson = Person <$> name1
    

    它的工作原理是因为定义了Functor Instacnce .

    instance Functor Parser where
      fmap f (Parser p) = Parser $ \s -> map (\(a,b) -> (f a, b)) $ p s
    

相关问题