gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:10:30 26 4
gpt4 key购买 nike

背景。在我的一个类中,我们一直在探索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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com