如果类型构造函数具有多个Type-parameter,那么如何使它成为Functor类型类的一部分?

时间:2017-03-30 09:17:56

标签: haskell functor type-constructor

我试图了解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>

我知道你可以将Type-constructor部分应用于它的第一个类型参数(标准currying):

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

但如果可以的话,如何将其部分应用于second / third / all except one类型参数?

谢谢。

2 个答案:

答案 0 :(得分:5)

假设您有query = "SELECT COUNT(email) FROM u_code WHERE code = %s" cursor.execute(query, [code,]) # COUNT query always return value, if no matching data # it simply return integer value 0, so we can safely take data # from result[0] result_check = cursor.fetchone() if not result_check[0]: print("empty email") result = 1; else: print("email taken") result = 0 print "result: " + str(result) ,请定义

data F a b = ...

在第二个参数中部分应用newtype Fx a = Fx { unFx :: F a X } F。现在你可以使用

X

instance Functor Fx where fmap f fa = ... 定义您的实例。

答案 1 :(得分:2)

更一般地说,你可以写

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(以及http://hackage.haskell.org/package/bifunctors-5.4.1/docs/Data-Bifunctor-Flip.html#t:Flip