问题标签 [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.
scala - 高阶 ScalaCheck
考虑以下类别的定义:
这是一元函数的一个实例:
现在,类别受某些法律的约束。相关组成(.
)和身份(id
):
我想用 ScalaCheck 对此进行测试。让我们尝试整数上的函数:
但这些是通过 (i) 特定类型 ( Int
) 和 (ii) 特定功能 ( intG
) 量化的。所以这是我的问题:在概括上述测试方面我能走多远,以及如何?或者,换句话说,是否有可能创建任意A => B
函数的生成器,并将其提供给 ScalaCheck?
haskell - 有没有结合范畴论/抽象代数和计算复杂度的理论?
范畴论和抽象代数处理函数与其他函数结合的方式。复杂性理论处理一个函数的计算难度。对我来说很奇怪,我还没有看到有人将这些研究领域结合起来,因为它们看起来很自然。有没有人这样做过?
作为一个激励性的例子,让我们看一下幺半群。众所周知,如果一个运算是一个幺半群,那么我们可以并行化这个运算。
例如在 Haskell 中,我们可以简单地定义加法是整数上的幺半群,如下所示:
现在,如果我们想计算 0 到 999 的总和,我们可以按顺序执行,如下所示:
或者我们可以并行进行
但是并行化这个幺半群才有意义,因为 mappend 在恒定时间内运行。如果不是这样呢?例如,列表是一个幺半群,其中 mappend 不会运行不固定的时间(或空间!)。我猜这就是为什么 Haskell 中没有默认的并行 mconcat 函数的原因。最好的实现取决于幺半群的复杂性。
似乎应该有一种方便的方式来描述这两个幺半群之间的差异。然后,我们应该能够用这些差异注释我们的代码,并让程序根据幺半群的复杂性自动选择要使用的最佳算法。
haskell - 在没有类型构造函数的情况下满足单子定律
给定例如一个类型
我可以轻松地为 Functor、Applicative、Monad 等编写实例。
但是如果“包含”类型是预先确定的,例如
我失去了编写这些实例的能力。
如果我要为我的 StringTree 类型编写函数
满足单子定律,我还能说那StringTree
是单子吗?
haskell - 如何为 Category 实例定义相等性?
例如,为了证明类别定律适用于对数据类型的某些操作,如何决定如何定义相等?考虑以下类型来表示布尔表达式:
试图证明Exp形成具有身份ETrue和运算符的类别是否可行:
没有重新定义Eq实例?使用Eq的默认实例,左恒等式违反了,即:
评估为False。但是,定义一个eval 函数:
和Eq实例为:
解决问题。用(==)进行比较是声称满足此类定律的一般要求,还是说这些定律适用于特定类型的相等运算符就足够了?
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 的函数的方式吗?还是有一些更简单的方法可以将此功能表示为我错过的标准类别?
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
排序(.)
?
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]
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 上的恒等函子。
等价问题是确定两个有限呈现类别是否存在等价。这个问题是不可判定的,但我希望它仍然是递归可枚举或协递归可枚举的。任何帮助将不胜感激。
haskell - applicative 到底有多少是关于应用而不是“组合”?
对于不确定性传播Approximate
类型,我希望有Functor
through的实例Monad
。然而,这不起作用,因为我需要包含类型的向量空间结构,所以它实际上必须是类的受限版本。由于似乎仍然没有这些标准库(或者是否存在?请指出我。有rmonad,但它使用*
而不是Constraint
作为上下文类型,这对我来说似乎已经过时了),我编写了自己的版本暂时。
这一切都很容易Functor
但直接翻译Applicative
,如
不可能,因为函数a->b
没有必要的向量空间结构* FScalarBasisSpace
。
然而,起作用的是改变受限应用类的定义:
然后定义<*>#
而不是cliftA2
作为自由函数
而不是一种方法。没有约束,这是完全等价的(事实上,很多Applicative
实例都是这样),但在这种情况下,它实际上更好:(<*>#)
仍然有无法满足的约束a->b
,Approximate
但这不会伤害应用实例,而且我仍然可以做有用的事情,比如
我认为CApplicative
对于. Set
_
所以我的问题:
比? <*>
_liftA2
同样,在不受约束的情况下,它们无论如何都是等价的。我实际上发现liftA2
更容易理解,但在 Haskell 中,考虑传递“函数容器”而不是对象容器和一些“全局”操作来组合它们可能更自然。并<*>
直接引出所有liftAμ
对于μ ∊ ℕ,而不仅仅是liftA2
; 从liftA2
only这样做是行不通的。
但是,这些受约束的类似乎对liftA2
. 特别是,它允许所有s 的CApplicative
实例,这在基方法时不起作用。而且我认为我们都同意应该始终比.CMonad
<*>#
Applicative
Monad
范畴论者会对这一切说什么?有没有办法在liftAμ
不需要a->b
满足相关约束的情况下获得将军?
*这种类型的线性函数实际上确实具有向量空间结构,但我绝对不能局限于这些。