我正在嘗試爲數據Person編寫解析器(data Person
)。但是,我必須用<$>
和<*>
將它寫在一行中,我嘗試了很多,但是我真的變得「過度」了。爲haskell中的人編寫解析器
解析器類型和往常一樣:
newtype Parser a = Parser (String -> [(a,String)])
而且我有這樣的功能:
parse :: Parser a -> String -> Maybe a
返回的第一個完整的解析。
例如
,如果我有這個簡單的功能:
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 「查克」 有Person
,所以我要以某種方式使用*>
得到它。
而就是這樣,只是與<$>
,<*>
和*>
這樣的行。
我沒有線索,而我越來越瘋狂。也許任何人都可以幫助我。
編輯
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
什麼是「滿足」和「多」? – syntagma
噢,當然,對不起。我現在寫。 –
假設你的解析器有一個仿函數實例,你應該可以這樣做'parsePerson = Person <$> name' – tsorn