我试图了解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
类型参数?
答案 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)