颠倒效果顺序的应用函子

8

假设有一个应用函子f,我有一个想法,可以创建一个新的应用函子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)

我的问题是:

  1. 这是一个有效的 Applicative 实例吗(是否遵守了 Applicative 定律)?
  2. 这个构造有名称吗?有没有某个模块隐藏在其中?

1
如果你对“Backwards”应用函子感兴趣,你可能也会喜欢“Data.Functor.Reverse”,它可以向后折叠和遍历。你也可能会发现“tardis”状态转换器很有趣。 - dfeuer
1个回答

12

IRC上的友好人士指向了transformers包提供的Backwards应用程序。 您可能还会喜欢标准库中可用的(<**>)运算符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接