所以,在哈斯克尔生态系统中有很多关于分类的讨论。但我觉得,到目前为止,我已经被渗透吸收的常识中缺少了一部分。(我也读过Mac著名导言的前几页,但我不认为我有足够的数学成熟度,无法将这篇文章中的智慧传递到我手头的实际编程中。)现在我将跟随一个涉及二进制函数的真实世界的例子,我很难用分类的方式来描述这个函数。
因此,我有一个函数链,它允许我使用S -> A,其中A是一个函数的类型同义词,类似于a -> b。现在,我想描述一个执行S -> a -> b的进程,但最后我得到了一个指向另一个箭头而不是对象的箭头。我该如何处理这种困境呢?
我无意中听到有人在谈论一种叫做n类的东西,但我不知道我是否应该试着去理解它是什么以及它是如何有用的。
虽然我相信我的抽象是准确的,但实际的函数是来自selectors的selectors和来自xml-conduit的Axis = Text.XML.Cursor.Cursor -> [Text.XML.Cursor.Cursor]。
发布于 2017-11-30 08:49:13
我可以用元组投影来描述这种情况,如下所示:

-或者用Haskell的实际术语说:

此图以反向fst & snd箭头代替二进制函数,该函数从其成分构造元组,而我绝不能直接描述这些箭头。请注意,虽然在这个图表中,Cursor只有一个传入箭头,但我应该记住,在实际代码中,一些真正的箭头X -> Axis & Y -> Cursor应该指向元组的两个投影,而不仅仅是符号投影函数。然后,流将均匀地向左向右流动。
实际上,我用两个源(构造一个元组,而不是一个态射)交换了两个反向箭头(元组的投影,在所有方面都是合法的态射)。
发布于 2017-11-29 07:50:16
范畴理论中有两种将二元函数建模为态射的方法(n元函数类似地处理--不需要新的机制)。一种是考虑未仓促的版本:
(A * B) -> C其中,我们以A和B类型的乘积作为起始对象。为此,我们需要类别包含这样的产品。(在Haskell中,产品是(A, B)编写的。从技术上讲,在Haskell中,这并不完全是产品类别,但让我们忽略这一点。)
另一种方法是将结果类型(B -> C)视为类别中的对象。通常,这被称为指数对象,编写为C^B。假设我们的类别有这样的对象,我们可以编写
A -> C^B这两种二元函数的表示是同构的:使用curry和uncurry,我们可以将它们相互转换。
事实上,当存在这样一个(自然)同构时,我们得到一个所谓的笛卡尔闭范畴,它是最简单的范畴形式,可以描述一个简单类型化的λ演算--每种类型函数语言的核心。
这种同构常被称为两个函子之间的附加关系。
(- * B) -| (- ^ B)https://stackoverflow.com/questions/47545964
复制相似问题