作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景。在我的一个类中,我们一直在探索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 返回列表中。
我们可以实例 Applicative
、Monad
、MonadPlus
和 Alternative
是类似的通用方式(以便它们适用于 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/
我是一名优秀的程序员,十分优秀!