Haskell 是哈斯克尔';s`Const`函子类似于范畴论中的常数函子?
我知道Haskell中的许多名字都受到范畴理论术语的启发,我正试图准确地理解类比的起点和终点 类别Haskell 是哈斯克尔';s`Const`函子类似于范畴论中的常数函子?,haskell,functor,category-theory,phantom-types,Haskell,Functor,Category Theory,Phantom Types,我知道Haskell中的许多名字都受到范畴理论术语的启发,我正试图准确地理解类比的起点和终点 类别Hask 我已经知道了,因为一些关于严格/懒惰和seq的技术细节,但现在我们暂且不谈。为清楚起见 的对象是具体类型,即类型*。这包括像Int->[Char]这样的函数类型,但不包括像Maybe::*->*这样需要类型参数的任何类型。但是,具体类型可能是Int::*属于Hask。类型构造函数/多态函数更像自然变换(或从Hask到自身的其他更一般的映射),而不是态射 Hask的态射是Haskell函数
Hask
我已经知道了,因为一些关于严格/懒惰和seq
的技术细节,但现在我们暂且不谈。为清楚起见
- 的对象是具体类型,即类型
。这包括像*
这样的函数类型,但不包括像Int->[Char]
这样需要类型参数的任何类型。但是,具体类型Maybe::*->*
属于可能是Int::*
。类型构造函数/多态函数更像自然变换(或从Hask
到自身的其他更一般的映射),而不是态射Hask
的态射是Haskell函数。对于两种具体类型Hask
和A
,hom集合B
是具有签名hom(A,B)
的函数集合A->B
- 函数组合由
。如果我们担心严格,我们可能需要严格或小心函数的定义f给出。g
函子
s是Hask中的内函子
我不认为上面的技术细节与我下面的困惑有任何关系。我想我明白这意味着什么。也就是说,如果我们有
类函子(F::*->*),其中
fmap::(a->b)->F a->F b
--可能会将类型T发送到(可能是T)
数据可能是a=无|只是a
实例函子可能在哪里
fmap f(正好x)=正好(fx)
fmap uuo无=无
函子
实例可能
以以下方式对应于从Hask
到Hask
的函子:
- 对于
中的每个具体类型Hask
,我们指定具体类型a
可能是a
- 对于
中的每一个态射Hask
,我们分配态射f::A->B
,它不发送可能A->可能B
和任何内容↦ 没有
只有x↦ 只有(f x)
ΔC:C→ C
将C类的每个对象映射到固定对象C∈C
和C到恒等态射的每个态射id\u C:C→ c
用于固定对象
常量
函子
考虑一下。为了清楚起见,我将在这里重新定义它,区分类型构造函数Konst::*->*->*
和数据构造函数Const::For all a,b。a->Konst a b
newtype Konst a b=Const{getConst::a}
实例函子(Konst m),其中
fmap::(a->b)->Konst m a->Konst m b
fmap u(常数v)=常数v
此类型检查是因为数据构造函数Const
是多态的:
v::a
(Const v)::全部b。康斯特a b酒店
我可以相信konstm
是Hask
类别中的内函子,因为在fmap
的实现中
- 在左侧,
显示为Const v
,由于多态性,这是正常的Konst ma
- 在右侧,
显示为一个Const v
,由于多态性,这是正常的Konst mb
konstm::*->*
看作范畴论意义上的常量函子,我的理解就会崩溃
- 什么是固定对象?类型构造函数
接受一些具体类型Konst m
,并给我们一个a
,至少表面上,对于每个Konst ma
,它是一个不同的具体类型。我们确实希望将每个类型a
映射到固定类型a
m
- 根据类型签名,
接受一个fmap
并给我们一个f::a->b
。如果konstma->konstmb
类似于常量函子,konstm
需要将每个态射发送到固定类型fmap
上的身份态射m
id::m->m
SimpleConst
?我快速尝试了一下,在多态性wrt幻影类型方面遇到了与上面相同的问题:
data SimpleKonst a=SimpleConst Int
实例函子SimpleConst,其中
fmap::(a->b)->SimpleConst a->SimpleConst b
fmap(SimpleConst x)=(SimpleConst x)
SimpleConst
在Haskell中是Const
,就像常量函子在范畴论中是
Hask
视为一个类别造成问题?我们是否需要修改Hask的定义,使对象真正成为类型的等价类,如果不存在幻象类型参数,这些类型将是相同的
getConst::for all a,b。konstab->a
是自然同构η的候选:(konstm)⇒ Δm从函子Konst m
到常量函子Δm:Hask→ Hask
,尽管我还不能确定后者是否可以在Has中表达
type CF m a = m
constIso1 :: Konst x a -> x
constIso1 (Const x) = x
constIso2 :: x -> Konst x a
constIso2 = Const
type family FunctorTyM f a :: Type
class FunctorMphM f where
fmap' :: (a -> b) -> FunctorTyM f a -> FunctorTyM f b
data KonstFtor a
type instance FunctorTyM (KonstFtor a) b = a
instance FunctorMphM (KonstFtor a) where
fmap' _ = id
data IdentityFtor
type instance FunctorTyM IdentityFtor a = a
instance FunctorMphM IdentityFtor where
fmap' f = f
data ListFtor
type instance FunctorTyM ListFtor a = [a]
instance FunctorMphM ListFtor where
fmap' f = map f
{-# LANGUAGE TypeFamilies, AllowAmbiguousTypes, TypeApplications #-}
type family FunctorTyM f a
class FunctorMphM f where ...
data KonstFtor a
...
data IdentityFtor
...
data ListFtor
...
main :: IO ()
main = do
print (fmap' @(KonstFtor Int) (+2) 5)
print (fmap' @IdentityFtor (+2) 5)
print (fmap' @ListFtor (+2) [7,8,9])
5
7
[9,10,11]
data TupleFstConst a
type instance FunctorTyM (TupleFstConst a) b = (a,b)
instance FunctorMphM (TupleFstConst a) where
fmap' f (x,y) = (x, f y)
data TupleSndConst b
type instance FunctorTyM (TupleSndConst b) a = (a,b)
instance FunctorMphM (TupleSndConst b) where
fmap' f (x,y) = (f x, y)
data TupleFtor
type instance FunctorTyM TupleFtor a = (a,a)
instance FunctorMphM TupleFtor where
fmap' f (x,y) = (f x, f y)
main :: IO ()
main = do
print (fmap' @(TupleFstConst Int) (+2) (5,50))
print (fmap' @(TupleSndConst Int) (+2) (5,50))
print (fmap' @TupleFtor (+2) (5,50))
(5,52)
(7,50)
(7,52)