问题标签 [category-theory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
861 浏览

scala - 高阶 ScalaCheck

考虑以下类别的定义:

这是一元函数的一个实例:

现在,类别受某些法律的约束。相关组成(.)和身份(id):

我想用 ScalaCheck 对此进行测试。让我们尝试整数上的函数:

但这些是通过 (i) 特定类型 ( Int) 和 (ii) 特定功能 ( intG) 量化的。所以这是我的问题:在概括上述测试方面我能走多远,以及如何?或者,换句话说,是否有可能创建任意A => B函数的生成器,并将其提供给 ScalaCheck?

0 投票
3 回答
2257 浏览

haskell - 有没有结合范畴论/抽象代数和计算复杂度的理论?

范畴论和抽象代数处理函数与其他函数结合的方式。复杂性理论处理一个函数的计算难度。对我来说很奇怪,我还没有看到有人将这些研究领域结合起来,因为它们看起来很自然。有没有人这样做过?


作为一个激励性的例子,让我们看一下幺半群。众所周知,如果一个运算是一个幺半群,那么我们可以并行化这个运算。

例如在 Haskell 中,我们可以简单地定义加法是整数上的幺半群,如下所示:

现在,如果我们想计算 0 到 999 的总和,我们可以按顺序执行,如下所示:

或者我们可以并行进行

但是并行化这个幺半群才有意义,因为 mappend 在恒定时间内运行。如果不是这样呢?例如,列表是一个幺半群,其中 mappend 不会运行不固定的时间(或空间!)。我猜这就是为什么 Haskell 中没有默认的并行 mconcat 函数的原因。最好的实现取决于幺半群的复杂性。


似乎应该有一种方便的方式来描述这两个幺半群之间的差异。然后,我们应该能够用这些差异注释我们的代码,并让程序根据幺半群的复杂性自动选择要使用的最佳算法。

0 投票
3 回答
269 浏览

haskell - 在没有类型构造函数的情况下满足单子定律

给定例如一个类型

我可以轻松地为 Functor、Applicative、Monad 等编写实例。

但是如果“包含”类型是预先确定的,例如

我失去了编写这些实例的能力。

如果我要为我的 StringTree 类型编写函数

满足单子定律,我还能说那StringTree是单子吗?

0 投票
1 回答
648 浏览

haskell - 如何为 Category 实例定义相等性?

例如,为了证明类别定律适用于对数据类型的某些操作,如何决定如何定义相等?考虑以下类型来表示布尔表达式:

试图证明Exp形成具有身份ETrue和运算符的类别是否可行:

没有重新定义Eq实例?使用Eq的默认实例,左恒等式违反了,即:

评估为False。但是,定义一个eval 函数

Eq实例为:

解决问题。用(==)进行比较是声称满足此类定律的一般要求,还是说这些定律适用于特定类型的相等运算符就足够了?

0 投票
2 回答
539 浏览

haskell - 由于柯里化,arity-n 的函数真的只是一个 n 类吗?可以做成 1 类吗?

这个问题有一个很长的前奏,然后我才能真正问出来:)

假设类型 A 和 B 代表类别,那么函数

f :: B -> A

是两个范畴之间的态射。我们可以创建一个新类别,其中 A 和 B 作为对象,f 作为箭头,如下所示:

在此处输入图像描述

现在,让我们引入一个新的类别 C 和函数 g:

g :: C -> B -> A

我希望能够将 C 和 g 添加到我上面的类别中,但我不确定该怎么做。直观地说,我想要这样的东西:

在此处输入图像描述

但我以前从未在类别图中看到过类似的东西。为了使这个洁净,我可以引入一个虚拟箭头 g' 并构造一个像这样的 2 类:

在此处输入图像描述

但这似乎是一个迟钝的画面。(当然,我们可以使用我上面画的图片作为正确图片的简写。)而且,现在也不完全清楚 g 和 g' 到底是什么。g 不再是一个将类别 C 作为输入并返回态射 :: B -> A 的函数。相反,

g' :: (C -> C)

g :: (C -> C) -> (B -> A)

如果我们通过 g 身份,那么一切都会正常工作。但是如果我们给它传递一些其他函数,那么谁知道会发生什么?

所以我的问题是:n 类别中的 n 箭头真的是我们应该考虑具有 arity n 的函数的方式吗?还是有一些更简单的方法可以将此功能表示为我错过的标准类别?

0 投票
1 回答
1354 浏览

haskell - 了解函数式编程中的排序

我主要是一个实际的人,但我觉得这很有趣。

我一直在考虑单子排序,有一些事情我需要澄清。因此,冒着听起来很傻的风险,它是:

monadic 成员绑定

bind :: m b -> (b -> m c) -> m c

可以对“动作”进行排序,让您可以显式访问中间值。

这比分类成员如何给我更多(.)

(.) :: cat b c -> cat a b -> cat a c

有了这个,我可以排序并访问中间值。毕竟(f . g) x = f(g (x))

如果我可以排序,为什么我需要bind排序(.)

0 投票
0 回答
244 浏览

haskell - 是否有任何有趣的模块可以处理函数的逆图像?

我刚刚发现自己编写了一些如下代码:

我曾尝试在 Google 上搜索有关 Haskell 的页面中使用术语“反向图像”或“原像”的情况,但没有运气。你们有没有人走过我现在走过的路,发现了这片土地?

我已经弄清楚这Invertible a不是 a Functor,因为当您尝试实现时, (no sensible function of type )fmap :: (a -> r) -> Invertible a b -> Invertible a r没有合理的价值。但也许还有其他一些我不知道的有趣操作。backward . fmap f(a -> r) -> (b -> [a]) -> r -> [a]

0 投票
7 回答
61846 浏览

haskell - 什么是自由单子?

我已经看到Free Monad这个词时不时出现了一段时间每个 人似乎只是在使用/讨论它们而没有解释它们是什么。那么:什么是自由单子?(我想说我熟悉 monad 和 Haskell 基础知识,但对范畴论只有非常粗略的了解。)

0 投票
0 回答
66 浏览

complexity-theory - 类别等价的复杂性

我试图找到有限呈现类别的等价问题的计算复杂性的特征。

给定两个类别 C 和 D,等价是两个函子 F : C -> D 和 G : D -> C 和两个自然同构 FG -> I_D 和 I_C -> GF,其中 I_C : C -> C 和 I_D : D -> D 是 C 和 D 上的恒等函子。

等价问题是确定两个有限呈现类别是否存在等价。这个问题是不可判定的,但我希望它仍然是递归可枚举或协递归可枚举的。任何帮助将不胜感激。

https://en.wikipedia.org/wiki/Equivalence_of_categories

https://en.wikipedia.org/wiki/Finite_presentation

0 投票
1 回答
652 浏览

haskell - applicative 到底有多少是关于应用而不是“组合”?

对于不确定性传播Approximate类型,我希望有Functorthrough的实例Monad。然而,这不起作用,因为我需要包含类型的向量空间结构,所以它实际上必须是类的受限版本。由于似乎仍然没有这些标准库(或者是否存在?请指出我。有rmonad,但它使用*而不是Constraint作为上下文类型,这对我来说似乎已经过时了),我编写了自己的版本暂时。

这一切都很容易Functor

但直接翻译Applicative,如

不可能,因为函数a->b没有必要的向量空间结构* FScalarBasisSpace

然而,起作用的是改变受限应用类的定义:

然后定义<*>#而不是cliftA2作为自由函数

而不是一种方法。没有约束,这是完全等价的(事实上,很多Applicative实例都是这样),但在这种情况下,它实际上更好:(<*>#)仍然有无法满足的约束a->bApproximate但这不会伤害应用实例,而且我仍然可以做有用的事情,比如

认为CApplicative对于. Set_

所以我的问题:

比? <*>_liftA2

同样,在不受约束的情况下,它们无论如何都是等价的。我实际上发现liftA2更容易理解,但在 Haskell 中,考虑传递“函数容器”而不是对象容器和一些“全局”操作来组合它们可能更自然。并<*>直接引出所有liftAμ对于μ ∊ ℕ,而不仅仅是liftA2; 从liftA2only这样做是行不通的。

但是,这些受约束的类似乎对liftA2. 特别是,它允许所有s 的CApplicative实例,这在基方法时不起作用。而且我认为我们都同意应该始终比.CMonad<*>#ApplicativeMonad

范畴论者会对这一切说什么?有没有办法在liftAμ不需要a->b满足相关约束的情况下获得将军?


*这种类型的线性函数实际上确实具有向量空间结构,但我绝对不能局限于这些。