[Background。在我的一堂课中,我们一直在研究Parser
monad。Parser
monad通常定义为:
newtype Parser a = Parser (String -> [(a, String)])
或作为
newtype Parser a = Parser (String -> Maybe (a, String))
在两种情况下,我们都可以使用在两种情况下均有效的代码将
Parser
实例化为Functor
:
instance Functor Parser where fmap f (Parser p) = Parser (fmap applyF . p) where applyF (result, s) = (f result, s)
如果我们构建了要返回
Parser
的Maybe (a, String)
,则在f
存在的情况下将result
应用于result
。如果我们构建了一个Parser
以返回[(a, String)]
,则这会将f
应用于列表中返回的每个result
。
我们可以实例化Applicative
,Monad
,MonadPlus
和Alternative
是类似的通用方法(因此它们可用于Maybe
或[]
)。
问题。
如果我根据用于包装结果的类型对Parser
进行参数化,如何为Functor
和朋友创建实例?newtype Parser m a = Parser (String -> m (a, String))
-- How do I instance `Parser` as a Functor if `m` is a Functor?
背景。在我的课程之一中,我们一直在探索Parser monad。解析器monad通常定义为新类型解析器a =解析器(String-> [(a,String)])或新类型解析器a ...
[您可以在此处构造一个约束,即m
也应为Functor
的实例,然后对该结果进行fmap
的约束: