2016-10-05 71 views
1

我在哈斯克爾初學者,我試圖做到這一點exercise需要把一個解析器到一個仿函數

所以我需要爲了實現應用型分析器來實現函子分析器。

但是我被困在如何實現Functor,即使使用「第一個函數提示」:(實際上,我無法弄清楚我們試圖通過使用「fmap f Parser a」來實現什麼。 ?

有人能解釋它

+2

向我們展示你的解析器類型的定義和嘗試的你在定義你自己的情況作出。但是無論哪種方式,或許你應該首先閱讀一些函數......真的,這些並不難,如果你甚至不知道如何處理它們,那麼你將很難實現'適用性實例。 [LYAH](http://learnyouahaskell.com/functors-applicative-functors-and-monoids)總是一個簡單的開始。 – leftaroundabout

+0

我已經讀到仿函數(如在lyahfgg)一些東西,我能理解上容易(?)函數子使用FMAP像列表,IO單子,單子可能。但是在這裏,我必須將函數映射到'String - > Maybe(a,String)'類型的函數上,並且在這種情況下,我不明白需要這樣做(期望需要實現Applicative )。 –

+0

解析器的函子實例用於將一些轉換函數應用於解析器的最終結果,實質上將「Parser a」變爲「Parser b」。 – shang

回答

2

我們需要定義

fmap :: (a -> b) -> Parser a -> Parser b 

像往常一樣,我們開始通過模式匹配:

fmap f (Parser p) = _ 

結果必須是一個解析器,讓我們應用構造:

fmap f (Parser p) = Parser _ 

現在我們需要的函數的孔,String -> Maybe (b, String)。所以讓我們做一個:

fmap f (Parser p) = Parser $ \s -> _ 

我會讓你嘗試完成這個。

+0

我想你的意思是'字符串 - >也許(b,字符串)' – amalloy

+0

這是我的實現。但因爲我不知道從仿函數會發生什麼,我不知道,如果它確定:'比如函子分析器,其中 FMAP克(分析器F)=分析器F「其中 F」 S = fs的情況下沒有 的 - >沒有 剛(X,β) - >剛(​​GX,SS) ' –

+0

@MaximeB,是的,這是完全正確的。通過閱讀Hackage上的課程文檔,您可以看到「Functor」的期望。 – dfeuer