我仍然试图掌握回调(来自类别理论),限制和通用属性的直觉,而我并没有完全发挥其实用性,所以也许你可以帮助摆脱一些对此的见解以及验证我的琐碎例子?
以下是故意冗长的,回调应该是(p, p1, p2)
,而(q, q1, q2)
是非通用对象的一个示例,用于“测试”回调以查看事情是否正常通信。
-- 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)
我只想提出一个符合定义的例子,但它似乎并不特别有用。我什么时候“寻找”拉回来,或者使用一个?
答案 0 :(得分:9)
我不确定Haskell函数是最好的上下文 谈论回撤。
A 的拉回 - &gt; B 和 C - &gt; B 可以使用 A x C 的子集进行标识, 和子集关系在Haskell中不能直接表达 类型系统。在您的具体示例中,回调将是 单个元素(1,True),因为 x = 1且 b = True是 f ( x )= g ( b )的唯一值。
一些好的&#34;实用的&#34;可以找到回拉的例子 从Category Theory for Scientists的第41页开始 作者:David I. Spivak。
关系联接是回撤的典型例子 这发生在计算机科学中。查询:
SELECT ...
FROM A, B
WHERE A.x = B.y
选择行对( a , b ),其中 a 是表A中的一行 和 b 是表B中的一行,其中 a 的某些功能 等于 b 的其他一些功能。在这种情况下的功能 被拉回的是 f(a)= a.x 和 g(b)= b.y 。
答案 1 :(得分:7)
回调的另一个有趣例子是类型推断中的类型统一。您可以从使用变量的多个位置获取类型约束,并且您希望找到最紧密的统一约束。我在my blog中提到了这个例子。