如果类型构造函数具有多个类型参数,如何使类型构造函数成为 Functor 类型类的一部分?

How to make a Type-constructor part of the Functor typeclass if it has more than one Type-parameter?

我试图了解 Functor-Typeclass 在 Haskell 中的工作方式。如果你有一个函数 f :: a -> b -> c 并且你想将它部分应用到 argB 以获得一个接受一个参数的函数,你可以简单地做:

f' :: a -> c
f' x = f x argB

并使用它。当使用类似这样的东西使 Functor-Typeclass 成为一部分时,是否有可能得到这样的行为:

instance Functor (MyTypeconstructor _ argB) where
   fmap <implementation of fmap>

我知道您可以将类型构造函数部分应用于其第一个类型参数(标准柯里化):

instance Functor (MyTypeconstructor argA) where
   fmap <implementation of fmap>

但是如果可能的话,你如何能将它部分地应用于它的 second / third / all except one 类型参数呢?

谢谢。

假设你有data F a b = ...,定义

newtype Fx a = Fx { unFx :: F a X }

F 部分应用于第二个参数中的 X。现在您可以使用

instance Functor Fx where
    fmap f fa = ...

F _ X 定义您的实例。

更笼统地说,你可以写成

newtype FlippedF a b = FlippedF { unFlip :: F b a } 

然后

instance Functor (FlippedF argB)

或者更一般地说,

newtype Flip f a b = Flip { unFlip :: f b a }

instance Functor (Flip F argB)

Flip 和更多的类型级组合器定义在例如http://hackage.haskell.org/package/TypeCompose-0.9.12/docs/Control-Compose.html#g:9 (and also http://hackage.haskell.org/package/bifunctors-5.4.1/docs/Data-Bifunctor-Flip.html#t:Flip)