Banana split และ fusion ในการเขียนโปรแกรมทำงานคืออะไร


22

คำศัพท์เหล่านี้ถูกกล่าวถึงในหลักสูตรมหาวิทยาลัยของฉัน googling อย่างรวดเร็วชี้ให้ฉันเห็นเอกสารจากมหาวิทยาลัยบางส่วน แต่ฉันกำลังมองหาคำอธิบายง่ายๆ


@jozefg: ขอบคุณสำหรับลิงค์ไปยังโพสต์ของคุณ คำถามหนึ่งเกี่ยวกับมัน ในประโยค "พีชคณิตในแง่นี้คือคู่ของวัตถุ C และแผนที่ FC → C. " C จริง ๆ ควรเป็นวัตถุหรือค่อนข้างเป็นหมวดหมู่หรือไม่? กล่าวอีกอย่างคือฉันไม่แน่ใจว่า F หมายถึง functor ในหมวดหมู่หรือไม่และ F-algebras นั้นเป็น algebras ที่เกิดจาก functor นั้นและถ้า F เป็นลูกศรพิเศษจากวัตถุไปยังตัวมันเอง
จอร์โจ

Cเป็นวัตถุในบางหมวดหมู่ (สมมุติว่าCC) Fเป็น functor จากCC -> CCดังนั้นมันจะแมปCCกลับไปยังตัวมันเอง ตอนนี้เป็นเพียงลูกศรปกติในหมวดหมู่F CC -> CC CCดังนั้นFพีชคณิตจึงเป็นวัตถุC : CCและเป็นลูกศรF C -> CในCC
Daniel Gratzer

คำตอบ:


4

แม้ว่าจะมีคำตอบให้ 2 คำตอบ แต่ฉันไม่คิดว่า "Banana Split" ได้รับการอธิบายที่นี่

มันแน่นอนใน "การเขียนโปรแกรมการทำงานกับกล้วย, เลนส์, ซองจดหมายและลวดหนาม, Erik Meijer Maarten Fokkinga, Ross Paterson, 1991"; บทความนั้นอ่านยาก (สำหรับฉัน) เนื่องจากการใช้ Squiggol อย่างหนัก อย่างไรก็ตาม "การสอนเกี่ยวกับความเป็นสากลและการแสดงออกของการพับ Graham Hutton, 1999" มีคำจำกัดความที่ง่ายต่อการแยกวิเคราะห์:

ในตัวอย่างแรก ๆ ของการใช้foldเพื่อสร้างสิ่งอันดับให้พิจารณาฟังก์ชันsumlengthที่คำนวณผลรวมและความยาวของรายการตัวเลข:

sumlength :: [Int] → (Int,Int)
sumlength xs = (sum xs, length xs)

โดยการรวมกันตรงไปตรงมาของคำนิยามของฟังก์ชั่นรวมและระยะเวลาในการใช้เท่าที่ได้รับก่อนหน้านี้ฟังก์ชั่นsumlengthสามารถนิยามใหม่เป็นโปรแกรมเดียวของพับที่สร้างคู่ของตัวเลขจากรายการของตัวเลข:

sumlength = fold (λn (x, y) → (n + x, 1 + y)) (0, 0)

คำจำกัดความนี้มีประสิทธิภาพมากกว่าคำจำกัดความดั้งเดิมเนื่องจากจะทำให้การสำรวจเส้นทางเดียวผ่านรายการอาร์กิวเมนต์มากกว่าการสำรวจเส้นทางสองแบบแยกกัน โดยทั่วไปจากตัวอย่างนี้แอปพลิเคชันของfoldใด ๆในรายการเดียวกันสามารถรวมกันได้เสมอเพื่อให้แอปพลิเคชันของfoldที่สร้างคู่โดยดึงดูดไปยังคุณสมบัติ 'Banana split' ของfold (Meijer, 1992) . ชื่อแปลกของคุณสมบัตินี้เกิดขึ้นจากข้อเท็จจริงที่ว่าตัวดำเนินการพับบางครั้งเขียนโดยใช้วงเล็บ (| |) ที่คล้ายกับกล้วยและตัวดำเนินการจับคู่บางครั้งเรียกว่าการแยก ดังนั้นการรวมกันของพวกเขาสามารถเรียกว่าแยกกล้วย!


19

ดังนั้นนี่คือการอ้างอิงถึงกระดาษโดย Meijer และอีกสองสามคนที่เรียกว่า " ฟังก์ชั่นการเขียนโปรแกรมกับกล้วย, เลนส์, ซองจดหมายและลวดหนาม " แนวคิดพื้นฐานคือเราสามารถใช้ชนิดข้อมูลแบบเรียกซ้ำ

 data List = Cons Int List | Nil

และเราสามารถแยกการเรียกซ้ำออกเป็นตัวแปรชนิด

 data ListF a = Cons Int a | Nil

เหตุผลที่ฉันต่อท้ายนั่นFก็เพราะตอนนี้เป็นนักแสดงแล้ว! นอกจากนี้ยังช่วยให้เราเลียนแบบรายการ แต่ด้วยการบิด: การสร้างรายการเราต้องซ้อนประเภทรายการ

type ThreeList = ListF (ListF (ListF Void)))

การกู้คืนรายการเดิมของเราที่เราจำเป็นต้องเก็บรังนี้เพียบ ที่จะทำให้เรามีประเภทListFFที่

  ListF ListFF == ListFF

เมื่อต้องการทำสิ่งนี้ให้นิยาม "ชนิดจุดคงที่"

  data Fix f = Fix {unfix :: f (Fix f)}
  type ListFF = Fix ListF

ในการออกกำลังกายคุณควรตรวจสอบสิ่งนี้ตามสมการข้างต้นของเราตอนนี้เราสามารถกำหนดว่ากล้วย (catamorphisms) คืออะไร!

  type ListAlg a = ListF a -> a

ListAlgs เป็นประเภทของ "algebras รายการ" และเราสามารถกำหนดฟังก์ชั่นเฉพาะ

  cata :: ListAlg a -> ListFF -> a
  cata f = f . fmap (cata f) . unfix

เพิ่มเติมอีก

  cata :: ListAlg a -> ListFF -> a
  cata :: (Either () (Int, a) -> a) -> ListFF -> a
  cata :: (() -> a) -> ((Int, a) -> a) -> ListFF -> a
  cata :: a -> (Int -> a -> a) -> ListFF -> a
  cata :: (Int -> a -> a) -> a -> [Int] -> a

ดูคุ้นเคยไหม cataเหมือนกันกับรอยพับที่ถูกต้อง!

สิ่งที่น่าสนใจจริงๆคือเราสามารถทำสิ่งนี้ได้มากกว่ารายการประเภทใดก็ตามที่กำหนดด้วย "จุดคงที่ของนักแสดง" มีcataและเพื่อรองรับพวกเขาทั้งหมดที่เราต้องผ่อนคลายกับลายเซ็นประเภท

  cata :: (f a -> a) -> Fix f -> a

นี่เป็นแรงบันดาลใจจากทฤษฎีหมวดหมู่ที่ฉันเขียนแต่นี่คือเนื้อของด้าน Haskell


2
มันเป็นมูลค่าการกล่าวขวัญว่ากล้วยเป็น (| |) วงเล็บที่กระดาษต้นฉบับใช้ในการกำหนด cata
jk

7

แม้ว่า jozefg จะให้คำตอบ แต่ฉันไม่แน่ใจว่ามันตอบคำถามหรือไม่ "กฎหมายฟิวชั่น" อธิบายไว้ในเอกสารต่อไปนี้:

การสอนเกี่ยวกับความเป็นสากลและความหมายของการพับ GRAHAM HUTTON, 1999

โดยทั่วไปจะกล่าวว่าภายใต้เงื่อนไขบางอย่างคุณสามารถรวม ("ฟิวส์") องค์ประกอบของฟังก์ชั่นและพับเป็นพับเดียวดังนั้นโดยทั่วไป

h · fold gw = fold fv

เงื่อนไขสำหรับความเท่าเทียมกันนี้คือ

hw = v
h (gxy) = fx (hy)

"การแบ่งกล้วย" หรือ "กฎหมายการแบ่งกล้วย" มาจากบทความ

ปฏิบัติการเขียนโปรแกรมด้วยกล้วยเลนส์ซองจดหมายและลวดหนาม Erik Meijer Maarten Fokkinga รอสส์แพตเตอร์สัน 2534

น่าเสียดายที่บทความนี้ยากที่จะถอดรหัสเนื่องจากมันใช้พิธีการแบบ Bird - Meertens ดังนั้นฉันจึงไม่สามารถทำหัวหรือส่วนท้ายของบทความได้ เท่าที่ฉันเข้าใจ "กฎหมายแบ่งกล้วย" มันบอกว่าถ้าคุณมี 2 เท่าในการดำเนินการโต้แย้งเดียวกันพวกเขาสามารถรวมเข้าด้วยกันในครั้งเดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.