反转效果顺序的应用函子

Posted

技术标签:

【中文标题】反转效果顺序的应用函子【英文标题】:Applicative functor that reverses order of effects 【发布时间】:2016-03-18 18:03:55 【问题描述】:

给定一个 applicative functor f,我想制作一个新的 applicative functor Rev f 就像 f 一样,但效果的顺序颠倒了。这里是:

import Control.Applicative

newtype Rev f a = Rev unRev :: f a

instance Functor f => Functor (Rev f) where
  fmap f (Rev fx) = Rev (fmap f fx)

instance Applicative f => Applicative (Rev f) where
  pure x = Rev (pure x)
  (Rev ff) <*> (Rev fx) = Rev (pure (\x f -> f x) <*> fx <*> ff)

我的问题是

    这是一个有效的Applicative 实例(它是否遵守Applicative 法律)? 这个结构有名字吗?是否有隐藏在某处的模块?

【问题讨论】:

如果您对Backwards 应用函子感兴趣,您可能也会喜欢Data.Functor.Reverse,它可以向后折叠和遍历。您可能还会发现tardis 状态转换器很有趣。 【参考方案1】:

IRC 上的友好人士指出transformers 包提供的Backwards 应用程序。您可能还喜欢标准库中提供的(&lt;**&gt;) 运算符。

【讨论】:

以上是关于反转效果顺序的应用函子的主要内容,如果未能解决你的问题,请参考以下文章

winapi为啥/如何反转消息的顺序?

反转字符串顺序

反转字符串中单词顺序的程序错误地打印反转的字符串

通过递归反转整数顺序

使用矩阵反转顶点缠绕顺序

反转字符数组中单词的顺序