Haskell 将解析器转换为函子的需要

Haskell 将解析器转换为函子的需要,haskell,Haskell,我是Haskell的初学者,我正在努力做到这一点 所以我需要实现函子解析器来实现应用程序解析器 但我一直在讨论如何实现这个函子,即使有“第一个函数提示”:(实际上,我不知道我们使用“fmap f Parser a”想要实现什么) 有人能解释一下吗?我们需要定义 fmap :: (a -> b) -> Parser a -> Parser b 通常,我们从模式匹配开始: fmap f (Parser p) = _ 结果必须是一个解析器,因此让我们应用构造函数: fmap f

我是Haskell的初学者,我正在努力做到这一点

所以我需要实现函子解析器来实现应用程序解析器

但我一直在讨论如何实现这个函子,即使有“第一个函数提示”:(实际上,我不知道我们使用“fmap f Parser a”想要实现什么)

有人能解释一下吗?

我们需要定义

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 -> _

我会让你试着完成这项工作。

向我们展示你的解析器类型的定义以及你自己在定义实例时所做的尝试。但是不管怎样,也许你应该先读一点关于函子的知识……真的,这些并不难,如果你甚至不知道如何处理它们,那么你将很难实现它们调用
应用程序
实例总是一个简单的开始。我已经读过一些关于函子的东西(比如在lyahfgg中),我可以理解fmap在简单(?)函子上的用法,比如列表、IO Monad、Maybe Monad。但是在这里,我必须将函数映射到
String->Maybe(a,String)类型的函数上
,在这种情况下,我无法理解这样做的必要性(除了实现Applicative需要它)。解析器的functor实例用于对解析器的最终结果应用一些转换函数,本质上是将
解析器a
更改为
解析器b
。我想你的意思是
字符串->可能(b,String)
这是我的实现。但由于我不知道从函子中可以得到什么,我不知道它是否正确:
实例函子解析器,其中fmap g(Parser f)=Parser f'其中f's=case f s of Nothing->Nothing Just(x,ss)->Just(gx,ss)
@MaximeB.,是的,完全正确。通过阅读Hackage上类的文档,您可以看到
函子的期望值。@dfeuer,您能给出一个真实的例子,说明为什么我要在解析器上使用fmap函数吗?@MaximeB.,我认为这是一个单独提出的适当问题。