为 Brent Yorgey 的 2013 年 UPenn 工作class家庭作业,如下newtype
exists:
newtype Parser a = Parser { runParser :: String -> Maybe (a, String) }
我正在尝试实施Parser
as a Functor
.
鉴于以下情况first
函数来帮助解决这个问题:
first :: (a -> b) -> (a, c) -> (b, c)
first f (a, c) = (f a, c)
我尝试了以下方法:
instance Functor (Parser) where
fmap g (Parser f) = Parser $ fmap (first g) (f . g)
然而,这是行不通的。
我认为,f
的类型是String -> Maybe (a, String)
。所以,我不知道如何apply
a String
to f
为了得到Maybe (a, String)
.
一旦我得到一个Maybe (a, String)
,我相信我可以简单地运行fmap (first g) ...
where ...
代表Maybe
.
请给我一个提示,以了解如何获得Maybe (a, String)
.
Since f
欠一个String
给出一种类型Maybe (a, String)
,我不知道在哪里可以找到String
争论。