我一直在通过 Haskell 中的一些范畴论来构建自己的方法,以创建更通用的 Monad。
在进入下一步之前,我需要能够使用自然转换。
现在常规仿函数
上的自然转换非常简单,它们只是函数
trans :: forall a . F a -> G a
(其中 F
和 G
是 Functor
),附加限制为
fmap f . trans = trans . fmap f
等价于交换图:
但是当我转向更多的分类仿函数时
class
( Category cat1
, Category cat2
)
=> Functor cat1 cat2 f
where
map :: cat1 a b -> cat2 (f a) (f b)
我不确定如何增强自然变换的定义以跟上。
该图表明
trans :: forall a . cat2 (F a) (G a)
哪里
Functor cat1 cat2 F
Functor cat1' cat2 G
但是我不清楚是否一定是cat1 ~ cat1'
。或者两个仿函数的变换和预范畴之间的关系是什么。
在更广泛的 Haskell Functor
背景下,在更一般的类别上,自然转换是什么样的?
最佳答案
However it is not clear to me that it must be the case that cat1 ~ cat1'.
仿函数 F 和 G 具有相同的域和余域,这是自然变换定义的一部分。 From nlab :
Given categories C and D, and functors F, G : C -> D
因此,Haskell 中定义的直接翻译是,具有域 cat1
和余域 cat2
的仿函数 F, G
之间的自然变换是作为多态项,由对象 a
索引的态射族 cat2 (F a) (G a)
:
n :: forall a. cat2 (F a) (G a)
这样某个图对于所有 f::cat1 a b
都是可交换的,即,我们有以下等式,其中 (.)
是 cat2 中的组合
:
fmap f . n = n . fmap f
其中 n
专门用于左侧的类型 a
和右侧的类型 b
。
请注意,这种编码的表达能力有限,因为 Haskell forall
与英语的“for all”不同。 n::forall a 的行为。 ...
不能真正依赖于 a
。 forall
暗示了一种“均匀性”(又名参数性)的形式,这在“自然变换”的定义中是找不到的。
关于haskell - 更普遍背景下的自然转变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62106430/