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

标签 haskell functional-programming typeclass functor parameterized-types

背景。在我的一个类中,我们一直在探索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应用于结果 如果结果存在。如果我们构建了一个Parser来返回[(a, String)],则这会将f应用于每个结果s 返回列表中。

我们可以实例 ApplicativeMonadMonadPlusAlternative 是类似的通用方式(以便它们适用于 Maybe[])。

问题。如果我根据用于包装结果的类型参数化 Parser,我如何为 Functor 和 friend 实例化它?

newtype Parser m a = Parser (String -> m (a, String))

-- How do I instance `Parser` as a Functor if `m` is a Functor?

最佳答案

您可以在这里构造一个约束,即 m 也应该是 Functor 实例的类型,然后对其进行 fmap结果:

instance <b>Functor m</b> => Functor (Parser m) where
    fmap f (Parser p) = Parser (\x -> <b>fmap g</b> (p x))
        where <b>g</b> (r, s) = (f r, s)
因此,这里的 g 是一个在元组的第一个元素上执行映射 f 的函数。因此,我们使用该 g 作为结果的“映射”函数。

因此,这适用于作为 Functor 实例的任何 m,例如 Maybe[]

关于haskell - 如何为具有两个参数的类型实例 `Functor`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58528701/

相关文章:

scala - 是否有任何基本限制阻止Scala对功能实现模式匹配?

haskell - 多参数类型同义词实例

具有类型构造函数的类型类定义的 Haskell 实例

scala - 将 Scala 类型示例转换为 Haskell

haskell - 有没有办法直接引用 Haskell 中的类型类实例?

Haskell 类型错误(短代码)

haskell - 在类型级别未定义

functional-programming - 如何从数据类型中提取元组?

recursion - 使用差异列表快速序列化 BST

haskell - 在 Haskell 中,Integral typeclass 是否意味着 Show typeclass?