srg*_*hma 7 haskell category-theory
我找不到fif的bifunctor模拟.
说明:
对象的Functor - 数据类型构造函数.类型 -
a -> f a
函数的函数 - fmap
.类型 - (a -> b) -> (fa -> fb)
对象的Bifunctor - 结果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有这样的类型(我是对的吗?)有一些例子
UPDATE
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')
是函数的bifunctor,但事实并非如此.态射的Bifunctor是bimap. Type: (a -> b) -> (? -> ?) -> p a ? -> p b ?.
我认为这p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
是不寻常的,但不是,它只是功能
lef*_*out 11
对象的Functor - 数据类型构造函数.类型 -
a -> f a
函数的函数 -
fmap
.类型 -(a -> b) -> (fa -> fb)
虽然这很有意义,但重要的是要认识到上述箭头有三种不同的含义.
对象的Functor - 数据类型构造函数.类型 -
a ? f a
函数的函数 -
fmap
.类型 -(a ? b) ? (f a ? f b)
哪里
?
是类型级别的"映射到符号",它将类型a
与类型相关联f a
.这与域和codomain的值级函数没有任何关系.(这些是在应用/ monad中找到的,但这是一个不同的故事.)a
f a
?
是一些态射的类型构造函数.在Hask类别中,那些态射恰好是Haskell函数,但这只是一个特例.?
是一个实际的函数类型构造函数.你可能现在忘了后两者之间的区别,但?
和?
真的完全不同的概念†.基本上,?
就像你在lambda中写的箭头一样
Maybe :: Type -> Type
Maybe = \a ? Maybe a
Run Code Online (Sandbox Code Playgroud)
而?
只是表达你在功能事物上抽象的一种方式.
另一个可能不太清楚的相关事情是你所谈论的对象是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,但是类型级别的函数实际上只能表示为类型族,即你可以表达的最接近的a ? f a
是type instance Functored a = f a
.