我找不到fmap的bifunctor类似物。
说明:
对象的函数-数据类型构造函数。类型-
a -> f a
函数的功能键-fmap
。输入-(a -> b) -> (fa -> fb)
对象的修饰符-bimap f g
的结果,其中f :: (a -> a')
,g :: (b -> b')
。输入-p a b -> p a' b'
函数的bifunctor-?。输入-p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
这就是为什么我认为bifunctor具有这样的类型(对吗?)
更新
UPDATE2
上图中的 p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
是从bifunctor到bifunctor甚至是profunctor的态射(因为所有函数都是profunctors)
摘要:
我认为p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
是功能的缩写,但事实并非如此。态射的化名是bimap. Type: (a -> b) -> (α -> β) -> p a α -> p b β.
我以为p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
是不寻常的,但事实并非如此,只是功能
答案 0 :(得分:11)
对象的函数-数据类型构造函数。输入-
a -> f a
函数的功能键-
fmap
。输入-(a -> b) -> (fa -> fb)
尽管这从广义上讲很重要,但重要的是要意识到上面的箭头具有三种不同的含义。
对象的函数-数据类型构造函数。输入-
a ⟼ f a
函数的功能键-
fmap
。输入-(a ⟿ b) ⟶ (f a ⟿ f b)
其中
⟼
是类型级别的“映射符号”,将类型a
与类型f a
关联。这与域为a
和共域f a
的值级函数没有什么关系。 (那些可以在应用程序/单子程序中找到,但这是另一回事。)⟿
是某种态射的类型构造器。在 Hask 类别中,这些态射恰好是Haskell函数,但这只是一个特例。⟶
是实际的函数类型构造函数。您可能暂时忘记了后两者的区别,但是⟼
和⟶
在概念上确实有很大的不同†。基本上,⟼
就像您在 lambda
Maybe :: Type -> Type
Maybe = \a ⟼ Maybe a
⟶
只是表达您对函数事物进行抽象的一种方式。
另一个可能不清楚的相关问题是,您正在谈论的对象是 Haskell类型。不是值(如OO对象一样)。
因此,我要这样表达您在上面给出的清单:
功能键
Type -> Type
,映射关联a ⟼ f a
。fmap
。输入:(a -> b) -> (f a -> f b)
。Bifunctor
Type×Type -> Type
或咖喱类Type -> Type -> Type
,映射关联a ⟼ b ⟼ p a b
。bimap
。输入:(a -> b) -> (α -> β) -> p a α -> p b β
。 † 实际上,Haskell没有⟼
或您用a -> f a
编写的内容。这将是类型级的lambda,但是类型级的函数实际上只能表示为 type family ,即,您可以最接近地表示a ⟼ f a
的是type instance Functored a = f a
。
答案 1 :(得分:1)
Bifunctor
不需要(->)
实例,只需(,)
:
b1 :: a -> Id a
b2 :: a -> Id2 a
-- instance Bifunctor (,) where
-- bimap f g (x, y) = (f x, g y)
f :: (Int, Float) -> (Id Int, Id2 Float)
f = bimap b1 b2