Ich versuche immer noch, eine Intuition von Pullbacks (aus der Kategorie Theorie), Grenzen und universellen Eigenschaften zu erfassen, und ich bin nicht ganz anziehend ihre Nützlichkeit, so vielleicht könnten Sie dazu beitragen, einige Einblicke darauf sowie mein triviales Beispiel verifizieren?Ist dies ein genaues Beispiel für einen Haskell Pullback?
Das folgende ist absichtlich ausführlich, der Pullback sollte (p, p1, p2)
sein, und (q, q1, q2)
ist ein Beispiel eines nicht-universellen Objekts, um den Pullback zu "testen", um zu sehen, ob Sachen richtig pendeln.
-- 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)
Ich habe nur versucht, mit einem Beispiel zu kommen, die die Definition passen, aber nicht besonders nützlich zu sein scheinen. Wann würde ich nach einem Rückzug suchen oder einen nutzen?
Ah, das macht Sinn. Gibt es eine analoge Operation für Pushouts in relationalen Sprachen? –
Ist es nicht das grundlegende Problem, dass Haskell keine Möglichkeit hat, diese speziellen Diagramme auszudrücken, anstatt irgendetwas mit Teilmengen zu tun? Ich frage mich, ob 'TypeInType' uns genug Macht gibt, um schmerzhaft über diese Ideen auf der Typ-Ebene zu sprechen. – dfeuer
Ich möchte zweimal upvote. Große Antwort – beefyhalo