类似物(似乎是)实现函数反演的逆变函数

Cli*_*ton 6 haskell category-theory category-abstractions

可以说我有以下内容

import Control.Category (Category, (.), id)

data Invertible a b = Invertible (a -> b) (b -> a)

instance Category Invertible where
  id = Invertible Prelude.id Prelude.id
  (Invertible f f') . (Invertible g g') = 
    Invertible (f Prelude.. g) (g' Prelude.. f')

invert (Invertible x y) = Invertible y x
Run Code Online (Sandbox Code Playgroud)

请注意,以下情况属实:

invert (g . f) == invert f . invert g
Run Code Online (Sandbox Code Playgroud)

这个结构看起来非常类似于逆变函子(维基百科),因为它遵循相同的公理:

 F(g . f) = F(f) . F(g) 
Run Code Online (Sandbox Code Playgroud)

就我而言,F简直就是这样invert.

我查看了Data.Functor.Contravariant.contramap,它具有以下类型的函数:

(a -> b) -> f b -> f a
Run Code Online (Sandbox Code Playgroud)

但我不知道在我的情况下我是如何实现的.例如,我无法找到明智的选择f,在我的情况下,没有任何功能a -> b,只是invert.

然而,invert仍然适合逆变函子的数学公理,所以我认为我可以将其融入现有的一类,但我找不到哪一个以及如何去做.任何帮助或指示将不胜感激.

luq*_*qui 8

一个类别有两个集合:对象和态射.

通常的Haskell前奏,看起来类中的类Data.Functor.Contravariant只在非常狭窄的类别上运行,类型是对象,而函数是态射,通常表示为Hask.标准Functor类也非常狭窄:它们只代表Hask上的endofunctors:它们必须将类型和函数类型赋予函数.

以仿函数为例Maybe.的方式Maybe作用于类型的只是,它需要的类型aMaybe a. Maybe映射IntMaybe Int等等(我知道这听起来有点微不足道).它做什么态射被编码fmap:fmap需要f :: (a -> b)在两个对象之间的态射Hask,并将其映射到fmap f :: (Maybe a -> Maybe b),在另一个射Hask对象之间的仿函数映射到.在Haskell我们不能定义Functor这需要例如IntChar-所有哈斯克尔Functor■找是类型构造-但在普通类理论上,我们可以.

Control.Category稍微概括一下:一个Control.Category类别的对象C仍然是类型[1],就像在Hask中一样,但它的态射是类型的东西C a b.所以在你的例子中,对象仍然是任意类型,但你的态射是类型的东西Invertible a b.由于您的态射不是函数,因此您将无法使用标准Functor类.

然而,在构建类别理论知识时,这是一个有趣的练习,可以定义一个在Category类别之间操作的仿函数类,而不是假设Hask,它可以捕获你的例子.请记住,仿函数作用于对象(类型)态射.

我会告诉你 - 如果你想要更多的指导,请随时评论.


[1]忽略PolyKinds,这使得这更加通用.

  • 让我们说我们颠倒了Control.Categorical.fmap中的'rab - > t(fa)(fb)`.相反,反之为`contramap :: rab - > t(fb)(fa)`.设r =不可逆,t =可逆.从这里我们得到`contramap :: Invertible ab - > Invertible(fb)(fa)`.我想在这一点上我们只需要"f"作为Id? (2认同)