ฟูฟรีเกิดขึ้นเป็นสิ่งที่ง่ายที่สุดที่เป็นไปตามกฎหมาย 'ฟู' ทั้งหมด กล่าวคือมันเป็นไปตามกฎหมายที่จำเป็นในการเป็นฟูและไม่มีอะไรพิเศษ
functor ที่หลงลืมนั้นเป็นส่วนหนึ่งที่ "ลืม" ส่วนหนึ่งของโครงสร้างเมื่อมันเปลี่ยนจากหมวดหมู่หนึ่งไปอีกหมวดหนึ่ง
ได้รับ functors F : D -> CและG : C -> DเราบอกF -| G, Fเป็น adjoint ซ้ายGหรือGเป็น adjoint สิทธิที่จะFเมื่อใดก็ตามที่ forall A, B: F a -> bเป็น isomorphic ไปa -> G bที่ลูกศรมาจากประเภทที่เหมาะสม
อย่างเป็นทางการนัก functor ฟรีเหลือ adjoint กับ functor ลืม
ฟรี Monoid
ให้เราเริ่มต้นด้วยตัวอย่างที่ง่ายกว่าคือโมโนฟรี
ใช้หนังสือซึ่งถูกกำหนดโดยชุดผู้ให้บริการบางTฟังก์ชั่นไบนารีบดคู่ขององค์ประกอบด้วยกันf :: T → T → Tและเช่นว่าคุณมีการเชื่อมโยงกฎหมายและกฎหมายประจำตัว:unit :: Tf(unit,x) = x = f(x,unit)
คุณสามารถสร้าง functor Uจากหมวดหมู่ของ monoids (ที่ลูกศรเป็น monoid homomorphisms นั่นคือพวกเขาให้แน่ใจว่าพวกเขาแมปunitไปunitที่ monoid อื่น ๆ และที่คุณสามารถเขียนก่อนหรือหลังการแมปไปยัง monoid อื่นโดยไม่เปลี่ยนความหมาย) เป็นหมวดหมู่ ของชุด (ที่ลูกศรเป็นเพียงลูกศรฟังก์ชั่น) ที่ 'ลืม' เกี่ยวกับการดำเนินการและunitและเพียงแค่ให้คุณตั้งค่าผู้ให้บริการ
จากนั้นคุณสามารถกำหนด functor Fจากหมวดหมู่ของชุดกลับไปที่หมวดหมู่ของ monoids ที่เหลือ adjoint กับ functor นี้ นั่นคือ functor functor ที่แมชุดaเพื่อหนังสือ[a]ที่และunit = []mappend = (++)
ดังนั้นเพื่อทบทวนตัวอย่างของเราจนถึงใน pseudo-Haskell:
U : Mon → Set -- is our forgetful functor
U (a,mappend,mempty) = a
F : Set → Mon -- is our free functor
F a = ([a],(++),[])
จากนั้นเพื่อแสดงให้Fเป็นอิสระเราต้องแสดงให้เห็นว่ามันเหลือ adjoint ให้Ufunctor ขี้ลืมนั่นคือที่เรากล่าวถึงข้างต้นเราต้องแสดงให้เห็นว่า
F a → b isomorphic ถึง a → U b
ตอนนี้จำได้ว่าเป้าหมายของการFอยู่ในหมวดหมู่Monของ monoids ที่ลูกศรมี homomorphisms หนังสือดังนั้นเราจึงจำเป็นที่จะแสดงให้เห็นว่า homomorphism หนังสือจากสามารถอธิบายได้อย่างแม่นยำโดยฟังก์ชั่นจาก[a] → ba → b
ใน Haskell เราเรียกด้านนี้ว่าชีวิตในSet(เอ้อHaskประเภทประเภท Haskell ที่เราแกล้งเป็นชุด) เพียงfoldMapซึ่งเมื่อผู้เชี่ยวชาญจากในรายการมีประเภทData.FoldableMonoid m => (a → m) → [a] → m
มีผลกระทบที่ตามมาจากการเป็นส่วนเสริม โดยเฉพาะอย่างยิ่งถ้าคุณลืมแล้วสร้างด้วยฟรีแล้วลืมอีกครั้งมันเหมือนคุณลืมครั้งเดียวและเราสามารถใช้สิ่งนี้เพื่อสร้างการเข้าร่วม monadic ตั้งแต่UFUF~ U(FUF)~ UFและเราสามารถส่งผ่านตัวตน monoid homomorphism จาก[a]ไป[a]ถึง isomorphism ที่กำหนด adjunction ของเราได้รับรายการ isomorphism จาก[a] → [a]เป็นหน้าที่ของประเภทa -> [a]และนี่เป็นเพียงกลับรายการ
คุณสามารถเขียนทั้งหมดนี้ได้โดยตรงโดยอธิบายรายการในคำศัพท์เหล่านี้ด้วย:
newtype List a = List (forall b. Monoid b => (a -> b) -> b)
Monad ฟรี
ดังนั้นสิ่งที่เป็นMonad ฟรี ?
เราทำแบบเดียวกับที่เราเคยทำมาก่อนเราเริ่มจาก functor U ที่หลงลืมจากหมวดหมู่ของ monads ที่ลูกศรนั้นเป็น homomorphisms monad ไปเป็นหมวดหมู่ของ endofunctors ที่ลูกศรมีการเปลี่ยนแปลงตามธรรมชาติและเรามองหา functor ที่เหลือ adjoint เพื่อที่
ดังนั้นสิ่งนี้เกี่ยวข้องกับแนวคิดของ monad ที่อิสระตามที่ใช้กันทั่วไปอย่างไร
รู้สิ่งที่เป็น monad ฟรีFree f, บอกคุณว่าให้ homomorphism monad จากFree f -> mเป็นสิ่งเดียวกัน (isomorphic ไป) การให้การเปลี่ยนแปลงธรรมชาติ (ก homomorphism functor) f -> mจาก จำไว้ว่าF a -> bต้องเป็น isomorphic เพื่อa -> U bให้ F เหลืออยู่ adjoint กับ U ที่นี่แมป monads กับ functors
F อย่างน้อย isomorphic กับFreeชนิดที่ฉันใช้ในfreeแพ็คเกจของฉันในการแฮ็ก
นอกจากนี้เรายังสามารถสร้างมันขึ้นมาในลักษณะที่คล้ายคลึงกับโค้ดด้านบนสำหรับรายการฟรีโดยการกำหนด
class Algebra f x where
phi :: f x -> x
newtype Free f a = Free (forall x. Algebra f x => (a -> x) -> x)
Cofree Comonads
เราสามารถสร้างบางสิ่งที่คล้ายกันได้โดยดูที่คำ adjoint ที่ถูกต้องกับ functor ที่หลงลืมว่ามันมีอยู่ functor cofree เป็นเพียง / adjoint / ขวาไปลืม functor และสมมาตรรู้บางสิ่งบางอย่างเป็น comonad cofree เป็นเช่นเดียวกับที่ได้รู้ว่าให้ homomorphism comonad จากเป็นสิ่งเดียวกันกับการให้การเปลี่ยนแปลงจากธรรมชาติw -> Cofree fw -> f