布伦特Yorgey的2013宾夕法尼亚大学class作业工作,以下newtype
存在:实施解析器函子
newtype Parser a = Parser { runParser :: String -> Maybe (a, String) }
我试图实现Parser
作为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
一个String
到f
为了得到Maybe (a, String)
。
一旦我得到一个Maybe (a, String)
,我相信我可以简单地运行fmap (first g) ...
其中...
代表Maybe
。
请给我一个提示,以了解如何获得Maybe (a, String)
。
由于f
欠一个String
给一个类型的Maybe (a, String)
,我不知道在哪里可以找到String
说法。
你靠近。你只想申请'g'一次,而你想以改变'f'应用程序结果的方式来完成。 –