2016-10-05 30 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