อธิบายการใช้ functor ในแง่เด็ดขาด - monoidal functors


40

ฉันต้องการที่จะเข้าใจApplicativeในแง่ของทฤษฎีหมวดหมู่

เอกสารสำหรับการApplicativeบอกว่ามันเป็นเรื่องที่มีความแข็งแกร่ง functor

ครั้งแรกที่วิกิพีเดียหน้าเกี่ยวกับfunctors monoidalบอกว่า functor monoidal เป็นทั้งหละหลวมหรือที่แข็งแกร่ง ดังนั้นสำหรับฉันดูเหมือนว่าแหล่งใดแหล่งหนึ่งผิดหรือใช้เงื่อนไขต่างกัน มีใครอธิบายได้บ้าง

ประการที่สองประเภท monoidal ซึ่งApplicativeเป็น function monoidal คืออะไร? ฉันสมมติว่า functors เป็น endo-functors ในหมวดหมู่ Haskell มาตรฐาน (object = types, morphisms = ฟังก์ชั่น) แต่ฉันไม่รู้ว่าโครงสร้าง monoidal ของหมวดนี้คืออะไร

ขอบคุณที่ช่วยเหลือ.

คำตอบ:


35

จริงๆแล้วมีการใช้คำสองคำว่า "ความแข็งแกร่ง" ในการเล่นที่นี่

  • endofunctor แข็งแกร่ง มากกว่าประเภท monoidalเป็นหนึ่งในที่มาพร้อมกับการเปลี่ยนแปลงธรรมชาติที่น่าพอใจ เงื่อนไขการเชื่อมโยงกันบางส่วนที่เกี่ยวข้องกับการเชื่อมโยงที่ฉันจะเกลี้ยกล่อม เงื่อนไขนี้บางครั้งก็ออกเสียงว่า "มีความแข็งแรง"F:CC(C,,I)σ:AF(B)F(AB)F

  • คนขี้หลอน monoidal functor เป็น functor ระหว่างสองประเภท monoidalและกับการเปลี่ยนแปลงตามธรรมชาติและอีกครั้งซึ่งเป็นไปตามเงื่อนไขการเชื่อมโยงที่เกี่ยวข้องกับผู้เชื่อมโยงอีกครั้งF:CD(C,,I)(D,,J)ϕ:F(A)F(B)F(AB)i:JF(I)

  • นักโมนิมอลที่แข็งแกร่ง คือคนที่และเป็นมอร์ฟิซึ่มส์ตามธรรมชาติ นั่นคือ , ด้วยและสิ่งที่ตรงกันข้ามกับอธิบายมอร์ฟิซึ่มส์F:CDϕiF(AB)F(A)F(B)ϕ

functor ที่ใช้งานในแง่ของโปรแกรม Haskell นั้นเป็นendofunctor lax monoidal ที่มีความแข็งแกร่งโดยมีโครงสร้าง monoidal ที่เป็นคำถามว่าเป็นผลิตภัณฑ์คาร์ทีเซียน ดังนั้นนี่คือเหตุผลที่คุณได้ศัพท์ที่ฟังดูขัดแย้งกันว่า

เช่นกันในหมวดหมู่ที่ปิดคาร์ทีเซียนมีความแข็งแรงเทียบเท่ากับการดำรงอยู่ของการเปลี่ยนแปลงทางธรรมชาติ(B)) นั่นคือการมีความแข็งแกร่งหมายความว่าการกระทำ functorial สามารถกำหนดได้อย่างชัดเจนว่าเป็นฟังก์ชั่นลำดับสูงในภาษาการเขียนโปรแกรมFmap:(AB)(F(A)F(B))

ในที่สุดถ้าคุณสนใจทฤษฎีประเภทของ Haskell แบบฟังก์ชั่นการใช้งานฉันก็แค่บล็อกเกี่ยวกับมัน


1
ขอบคุณสำหรับคำตอบ. ฉันเข้าใจอย่างถูกต้องหรือไม่ว่าอินสแตนซ์ทั้งหมดFunctorมีจุดแข็ง (ผลิตภัณฑ์ WRT) เพียงเพราะพวกเขากำหนดโดยใช้fmapภายในภาษาหรือไม่ นอกจากนี้ปริศนาอะไรที่ฉันนิยามคำว่าและกลับด้านเมื่อเปรียบเทียบกับทั้งโพสต์บล็อกของคุณและบทความ Wikipedia - มันเป็นคำที่สะกดผิดหรือเปล่า? ผมพยายามที่จะกำหนดใช้เป็นที่ชัดเจนต้องการ ϕipureipure' = \v -> fmap (\() -> v) (i ())i :: (Applicative f) => () -> f ()
Petr Pudlák

1
ฉันพิมพ์ผิดในคำตอบนี้ - ตอนนี้คงที่ และใช่อินสแตนซ์ทั้งหมดของFunctorstrong (ผลิตภัณฑ์ wrt)
Neel Krishnaswami

คุณช่วยอธิบายได้อย่างละเอียดได้ไหมว่าโมนาดอยู่ตรงไหน? ถ้าฉันเข้าใจถูกต้องมันเป็นจุดจบของ monoidal เช่นกัน
egdmitry

@egdmitry monoidalไม่monadal นี่หมายความว่าเราจัดการกับ endofunctor ประเภท monoidal (ในกรณีนี้เป็น monoidal สัมพันธ์กับผลิตภัณฑ์คาร์ทีเซียนคือคู่) Hask
kirelagin

ฉันขอเสนอให้ใช้คำที่แข็งแกร่งเพื่อหลีกเลี่ยงการปะทะของสัญกรณ์กับ "แข็งแรง"? มันเป็นภาษาสก็อต (โดยเฉพาะจุดที่นี่) การแปรผันของ "แข็งแรง" ซึ่งใช้ครั้งแรกในพระคัมภีร์ไบเบิลของคลิฟฟ์
Fosco

3

เพื่อให้เข้าใจถึงการประยุกต์ใช้ตามที่ monad ชักชวนฉันต้องการชี้ให้เห็นโครงสร้างต่อไปนี้:

โยเนดะแทรกหมายถึงว่ามีมอร์ฟระหว่างและFB) ในหมวดหมู่ของประเภท Haskell นี่คือการทำแผนที่ ประเภท การประเมินที่จากนั้นใช้ฟังก์ชั่น arrow arrow ลูกศรฟังก์ชั่นที่เกิดขึ้น - ถ้าองค์ประกอบของการแปลงตามธรรมชาติทำให้รู้สึกเป็นลูกศร - และ abstractingอีกครั้งเราได้รับการแมปประเภท ตอนนี้ถ้า functor มาพร้อมกับ monadic 'join' ให้ทำแผนที่จากถึงFAnat(Hom(A,B),FB)

a(gF(g)(a))
FABAFB.
FAFA
FAFBAFFB.
FFBFBและถ้าเราสลับไปรอบ ๆ แลมบ์ดา abstractions และสองช่องแรกเราจะได้รับฟังก์ชันประเภท ซึ่งหนึ่งในนั้นหมายถึง <*> (นี่คือสิ่งที่คุณได้รับผ่านใน Haskell)
FBAFAFB,
LiftM2 id
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.