Я все еще пытаюсь понять интуицию откат (от теории категорий), пределы и универсальные свойства, и я не совсем понимаю их полезность, так что, возможно, вы могли бы помочь пролить некоторое понимание на это, а также проверить мой тривиальный пример?Является ли это точным примером Haskell Pullback?
Ниже приведено намеренное подробное описание. Откат должен быть (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)
Я просто пытался придумать пример, который соответствует определению, но он не кажется особенно полезным. Когда я буду «искать» откат или использовать его?
А, это имеет смысл. Будет ли аналогичная операция для pushouts в реляционных языках? –
Не является ли фундаментальной проблемой, что у Haskell отсутствует способ выразить, что определенные диаграммы коммутируют, а не что-то связанное с подмножествами? Интересно, что 'TypeInType' дает нам достаточно энергии, чтобы говорить об этих идеях, болезненно, на уровне типа. – dfeuer
Я бы хотел дважды подняться. Большой ответ – beefyhalo