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
仍然适合逆变函子的数学公理,所以我认为我可以将其融入现有的一类,但我找不到哪一个以及如何去做.任何帮助或指示将不胜感激.
一个类别有两个集合:对象和态射.
通常的Haskell前奏,看起来类中的类Data.Functor.Contravariant
只在非常狭窄的类别上运行,类型是对象,而函数是态射,通常表示为Hask.标准Functor
类也非常狭窄:它们只代表Hask上的endofunctors:它们必须将类型和函数类型赋予函数.
以仿函数为例Maybe
.的方式Maybe
作用于类型的只是,它需要的类型a
来Maybe a
. Maybe
映射Int
到Maybe Int
等等(我知道这听起来有点微不足道).它做什么态射被编码fmap
:fmap
需要f :: (a -> b)
在两个对象之间的态射Hask,并将其映射到fmap f :: (Maybe a -> Maybe b)
,在另一个射Hask对象之间的仿函数映射到.在Haskell我们不能定义Functor
这需要例如Int
对Char
-所有哈斯克尔Functor
■找是类型构造-但在普通类理论上,我们可以.
Control.Category
稍微概括一下:一个Control.Category
类别的对象C
仍然是类型[1],就像在Hask中一样,但它的态射是类型的东西C a b
.所以在你的例子中,对象仍然是任意类型,但你的态射是类型的东西Invertible a b
.由于您的态射不是函数,因此您将无法使用标准Functor
类.
然而,在构建类别理论知识时,这是一个有趣的练习,可以定义一个在Category
类别之间操作的仿函数类,而不是假设Hask,它可以捕获你的例子.请记住,仿函数作用于对象(类型)和态射.
我会告诉你 - 如果你想要更多的指导,请随时评论.
[1]忽略PolyKinds
,这使得这更加通用.