如何为具有两个参数的类型实例化Functor?

问题描述 投票:1回答:1

[Background。在我的一堂课中,我们一直在研究Parser monad。Parsermonad通常定义为:

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)

如果我们构建了要返回ParserMaybe (a, String),则在f存在的情况下将result应用于result。如果我们构建了一个Parser以返回[(a, String)],则这会将f应用于列表中返回的每个result

我们可以实例化ApplicativeMonadMonadPlusAlternative是类似的通用方法(因此它们可用于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 ...

haskell functional-programming typeclass functor parameterized-types
1个回答
0
投票

[您可以在此处构造一个约束,即m也应为Functor的实例,然后对该结果进行fmap的约束:

© www.soinside.com 2019 - 2024. All rights reserved.