因此,关于 Haskell 生态系统中的类别有很多讨论。但我觉得我迄今为止通过渗透吸收的常识中缺少了一点。 (我确实也读过 Mac Lane 著名介绍的前几页,但我不相信我有足够的数学成熟度来将本文中的智慧运用到我手头的实际编程中。)现在,我将介绍一个涉及二元函数的现实世界示例,我很难用分类术语来描述该函数。
所以,我有这个函数链,它允许我S -> A
,其中A
是函数的类型同义词,类似于a -> b
。现在,我想描述一个执行 S -> a -> b
的过程,但最终我得到了一个指向另一个箭头而不是一个对象的箭头。我该如何应对这样的困境?
我确实无意中听到有人谈论一个名为n-category的东西,但我不知道我是否应该尝试了解它是什么以及它如何有用。
虽然我相信我的抽象是准确的,但实际的函数是 parsePath >>> 错误 id >>> toAxis::String -> Text.XML.Cursor.Axis
from selectors
和 Axis = Text.XML.Cursor.Cursor -> [Text.XML.Cursor.Cursor]
来自 xml-conduit
。
最佳答案
有两种方法可以将二元函数建模为范畴论中的态射(n 元函数的处理方式类似——不需要新的机制)。一种是考虑未柯里化(Currying)的版本:
(A * B) -> C
我们将类型 A
和 B
的乘积作为起始对象。为此,我们需要类别来包含此类产品。 (在 Haskell 中,产品写作 (A, B)
。好吧,从技术上讲,在 Haskell 中,这并不完全是类别中的产品,但让我们忽略这一点。)
另一种方法是将结果类型(B -> C)
视为类别中的对象。通常,这称为指数对象,写作C^B
。假设我们的类别有这样的对象,我们可以这样写
A -> C^B
这两种二元函数的表示形式是同构的:使用 curry
和 uncurry
我们可以将它们相互转换。
确实,当存在这样的(自然)同构时,我们得到了所谓的笛卡尔闭范畴,这是范畴的最简单形式,可以描述简单类型的 lambda 演算——核心每种类型的函数语言。
这种同构经常被引用为两个仿函数之间的附加
(- * B) -| (- ^ B)
关于haskell - 如何将范畴论图与多元函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545964/