布倫特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'應用程序結果的方式來完成。 –