ฟูฟรีเกิดขึ้นเป็นสิ่งที่ง่ายที่สุดที่เป็นไปตามกฎหมาย 'ฟู' ทั้งหมด กล่าวคือมันเป็นไปตามกฎหมายที่จำเป็นในการเป็นฟูและไม่มีอะไรพิเศษ
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 :: T
f(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 ให้U
functor ขี้ลืมนั่นคือที่เรากล่าวถึงข้างต้นเราต้องแสดงให้เห็นว่า
F a → b
isomorphic ถึง a → U b
ตอนนี้จำได้ว่าเป้าหมายของการF
อยู่ในหมวดหมู่Mon
ของ monoids ที่ลูกศรมี homomorphisms หนังสือดังนั้นเราจึงจำเป็นที่จะแสดงให้เห็นว่า homomorphism หนังสือจากสามารถอธิบายได้อย่างแม่นยำโดยฟังก์ชั่นจาก[a] → b
a → b
ใน Haskell เราเรียกด้านนี้ว่าชีวิตในSet
(เอ้อHask
ประเภทประเภท Haskell ที่เราแกล้งเป็นชุด) เพียงfoldMap
ซึ่งเมื่อผู้เชี่ยวชาญจากในรายการมีประเภทData.Foldable
Monoid 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 f
w -> f