如果类型构造函数具有多个类型参数,如何使类型构造函数成为 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)
我试图了解 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)