haskell中函数的bifunctor在哪里?

时间:2018-07-18 08:09:53

标签: haskell category-theory

我找不到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具有这样的类型(对吗?)

enter image description here


更新

enter image description here


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')是不寻常的,但事实并非如此,只是功能

2 个答案:

答案 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