这是 Haskell 回调的准确示例吗?

Is this an accurate example of a Haskell Pullback?

我仍在尝试掌握 回调(来自范畴论)、限制和普遍属性的直觉,但我不太明白它们的用处,所以也许您可以帮助阐明一些见解并验证我的简单示例吗?

以下是故意冗长的,回调应该是 (p, p1, p2),而 (q, q1, q2) 是一个非通用对象的例子 "test" 回调反对看事情是否通畅正确。

-- MY DIAGRAM, A -> B <- C
type A = Int
type C = Bool
type B = (A, C)
f :: A -> B
f x = (x, True)
g :: C -> B
g x = (1, x)

-- PULLBACK, (p, p1, p2)
type PL = Int
type PR = Bool
type P = (PL, PR)
p = (1, True) :: P
p1 = fst
p2 = snd
-- (g . p2) p == (f . p1) p

-- TEST CASE
type QL = Int
type QR = Bool
type Q = (QL, QR)
q = (152, False) :: Q
q1 :: Q -> A
q1 = ((+) 1) . fst
q2 :: Q -> C
q2 = ((||) True) . snd

u :: Q -> P
u (_, _) = (1, True)
-- (p2 . u == q2) && (p1 . u = q1)

我只是想想出一个符合定义的例子,但它似乎并不是特别有用。我什么时候 "look for" 回撤或使用回撤?

我不确定 Haskell 函数是最好的上下文 其中谈回调。

A的回调 -> BC -> B 可以用 A x C 的子集来标识, Haskell 中不能直接表达子集关系 类型系统。在您的具体示例中,回调将是 单个元素 (1, True) 因为 x = 1 和 b = True 是 f(x) = g(b).

可能会找到一些很好的 "practical" 回调示例 从 Category Theory for Scientists 第 41 页开始 作者:David I. Spivak。

关系连接是回调的典型例子 这发生在计算机科学中。查询:

SELECT ...
FROM A, B
WHERE A.x = B.y

选择行对 (a,b) 其中 a 是来自table一个 b 是 table B 的一行,其中 a 的某些函数 等于 b 的一些其他函数。在这种情况下,函数 被拉回的是 f(a) = a.xg(b) = b.y.

回调的另一个有趣示例是类型推断中的类型统一。您从使用变量的多个地方获得类型约束,并且您想要找到最严格的统一约束。我在 my blog.

中提到了这个例子