haskell - 如何将范畴论图与多元函数一起使用?

标签 haskell category-theory

因此,关于 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

我们将类型 AB 的乘积作为起始对象。为此,我们需要类别来包含此类产品。 (在 Haskell 中,产品写作 (A, B)。好吧,从技术上讲,在 Haskell 中,这并不完全是类别中的产品,但让我们忽略这一点。)

另一种方法是将结果类型(B -> C)视为类别中的对象。通常,这称为指数对象,写作C^B。假设我们的类别有这样的对象,我们可以这样写

A -> C^B

这两种二元函数的表示形式是同构的:使用 curryuncurry 我们可以将它们相互转换。

确实,当存在这样的(自然)同构时,我们得到了所谓的笛卡尔闭范畴,这是范畴的最简单形式,可以描述简单类型的 lambda 演算——核心每种类型的函数语言。

这种同构经常被引用为两个仿函数之间的附加

(- * B) -| (- ^ B)

关于haskell - 如何将范畴论图与多元函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545964/

相关文章:

Haskell 在一种条件下定义多个变量?

haskell - Free Monoid 和 Monoid 之间的主要区别是什么?

scala - 类型构造函数是单子(monad)还是有单子(monad)?

haskell - 让函数根据参数的值返回不同的类型

haskell - Haskell 中的 OO 抽象类型模式

haskell - 在用户定义类型和现有类型之间定义已经存在(例如在 Prelude 中)运算符的正确方法是什么?

haskell - 通常说来,monad变压器是否由附加条件产生?

haskell - Applicative Functors 映射的类别到底是什么?

haskell - 是否有一个 monad 没有相应的 monad 转换器(IO 除外)?

Haskell:FRP react 性 Parsec?