คำถามติดแท็ก functional-programming

6
มีอะไรใหม่ในโครงสร้างข้อมูลที่ใช้งานได้จริงตั้งแต่ Okasaki?
ตั้งแต่ปี 1998 หนังสือของ Chris Okasaki "โครงสร้างข้อมูลที่ใช้งานได้อย่างแท้จริง" ฉันไม่ได้เห็นโครงสร้างข้อมูลที่ทำงานได้อย่างน่าตื่นเต้นจนเกินไปปรากฏขึ้นใหม่ ฉันชื่อไม่กี่: IntMap (คิดค้นโดย Okasaki ในปี 1998 แต่ไม่มีในหนังสือเล่มนั้น) ต้นไม้นิ้ว (และลักษณะทั่วไปของพวกเขามากกว่า monoids) นอกจากนี้ยังมีวิธีที่น่าสนใจในการใช้งาน datastructures ที่รู้จักกันแล้วเช่นการใช้ "nested types" หรือ "datatypes พีชคณิตทั่วไป" เพื่อรับรองค่าคงที่ของต้นไม้ มีแนวคิดใหม่อื่นใดอีกบ้างที่ปรากฏในปี 1998 ในด้านนี้

2
คำถามที่โดดเด่นในโครงสร้างข้อมูลที่ทำงานได้อย่างหมดจดคืออะไร?
คำถามนี้เป็นแรงบันดาลใจคำถามเกี่ยวกับสิ่งใหม่ใน PFDs ตั้งแต่การตีพิมพ์หนังสือ Okasaki ในปี 1998 ฉันจะเริ่มด้วยคำถามสองข้อที่ฉันมี: มีโครงสร้างข้อมูลชุดการทำงานอย่างหมดจดที่ใกล้ความเร็วของตารางแฮช? ความพยายามยังไม่จบ มีต้นไม้นิ้วที่ทำงานได้อย่างหมดจดด้วย O (1) ต่อท้าย? สิ่งที่ดีที่สุดคือ O (lg lg n) ซึ่งคิดค้นโดย Kaplan และ Tarjan ปัญหาโครงสร้างข้อมูลที่ทำงานได้อย่างแท้จริงอื่นใดที่เปิดอยู่?

2
อธิบายการใช้ functor ในแง่เด็ดขาด - monoidal functors
ฉันต้องการที่จะเข้าใจApplicativeในแง่ของทฤษฎีหมวดหมู่ เอกสารสำหรับการApplicativeบอกว่ามันเป็นเรื่องที่มีความแข็งแกร่ง functor ครั้งแรกที่วิกิพีเดียหน้าเกี่ยวกับfunctors monoidalบอกว่า functor monoidal เป็นทั้งหละหลวมหรือที่แข็งแกร่ง ดังนั้นสำหรับฉันดูเหมือนว่าแหล่งใดแหล่งหนึ่งผิดหรือใช้เงื่อนไขต่างกัน มีใครอธิบายได้บ้าง ประการที่สองประเภท monoidal ซึ่งApplicativeเป็น function monoidal คืออะไร? ฉันสมมติว่า functors เป็น endo-functors ในหมวดหมู่ Haskell มาตรฐาน (object = types, morphisms = ฟังก์ชั่น) แต่ฉันไม่รู้ว่าโครงสร้าง monoidal ของหมวดนี้คืออะไร ขอบคุณที่ช่วยเหลือ.

8
อัลกอริธึมที่สูงกว่า
อัลกอริทึมที่รู้จักกันดีส่วนใหญ่เป็นลำดับแรกในแง่ที่ว่าอินพุตและเอาต์พุตเป็นข้อมูล "ธรรมดา" บางอย่างเป็นลำดับที่สองในลักษณะที่ไม่สำคัญเช่นการเรียงลำดับแฮชเทเบิลหรือฟังก์ชั่นแผนที่และการพับ: พวกมันถูกกำหนดค่าโดยฟังก์ชั่น แต่พวกเขาไม่ได้ทำสิ่งที่น่าสนใจเลย บางอันก็เป็นลำดับที่สอง แต่ค่อนข้างน่าสนใจกว่า: Fingertrees แปรผันตาม monoids การแยกนิ้วบนเพรดิเคตแบบจำเจ คำนำหน้ารวมอัลกอริธึมอีกครั้งโดยพารามิเตอร์หรือ monoid ฯลฯ ในที่สุดบางคำสั่งที่สูงกว่า "แท้จริง" ในแง่ที่น่าสนใจที่สุดสำหรับฉัน: Y combinator รายการความแตกต่าง มีอัลกอริทึมการสั่งซื้อที่สูงกว่าอื่น ๆ หรือไม่? ในความพยายามที่จะชี้แจงคำถามของฉันภายใต้ "nontrivial-ลำดับสูงกว่า" ฉันหมายถึง "การใช้สิ่งอำนวยความสะดวกขั้นสูงของระเบียบการคำนวณในวิธีที่สำคัญในส่วนต่อประสานของอัลกอริทึมและ / หรือการใช้งาน"

1
ภาษาโปรแกรมที่มีฟังก์ชั่นมาตรฐาน
มีภาษาการเขียนโปรแกรม (การทำงานหรือไม่) ที่ฟังก์ชั่นทั้งหมดมีรูปแบบที่ยอมรับได้หรือไม่? นั่นคือฟังก์ชั่นใด ๆ สองฟังก์ชันที่ส่งกลับค่าเดียวกันสำหรับชุดอินพุตทั้งหมดแสดงด้วยวิธีเดียวกันเช่นถ้า f (x) ส่งกลับ x + 1 และ g (x) ส่งคืน x + 2 จากนั้น f (f (x (x) )) และ g (x) จะสร้างไฟล์เรียกทำงานที่ไม่สามารถแยกได้เมื่อรวบรวมโปรแกรม บางทีที่สำคัญกว่านั้นฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับการแสดงที่เป็นที่ยอมรับของโปรแกรมได้ที่ไหน ดูเหมือนว่าเป็นคำถามธรรมชาติที่จะถามและฉันกลัวว่าฉันไม่ทราบคำที่เหมาะสมสำหรับสิ่งที่ฉันกำลังมองหา ฉันอยากรู้ว่าเป็นไปได้ไหมที่ภาษาทัวริงจะสมบูรณ์และถ้าไม่คุณสามารถใช้ภาษาการเขียนโปรแกรมได้อย่างไรในขณะที่ยังคงรักษาคุณสมบัติดังกล่าวอยู่ พื้นหลังของฉันค่อนข้าง จำกัด ดังนั้นฉันจึงต้องการแหล่งที่มากับสิ่งที่จำเป็นต้องมีน้อยกว่า แต่การอ้างอิงถึงแหล่งข้อมูลขั้นสูงอาจจะเท่เช่นกันเพราะฉันรู้ว่าฉันต้องการทำงานต่อ

2
แคลคูลัสแลมบ์ด้าและตรรกะการรวมกันเป็นแบบเดียวกันหรือไม่?
ฉันกำลังอ่าน " แลมบ์ดาแคลคูลัสและเครื่องผสม " โดย Hindley และ Seldin ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ได้สนใจแคลคูลัสแลมบ์ดาเสมอเนื่องจากการมีส่วนร่วมกับการเขียนโปรแกรมการทำงาน (เริ่มจาก Lisp และ SICP และตอนนี้กับ R และ Haskell) ใน " ไบนารีแลมบ์ดาแคลคูลัสและ Combinatory Logic" , John Trompกล่าวว่า: CL อาจถูกมองว่าเป็นส่วนย่อยของแคลคูลัสแลมบ์ดา ... ทฤษฎีส่วนใหญ่เหมือนกันกลายเป็นสิ่งที่เท่าเทียมกันเมื่อมีกฎการขยาย ภายใต้เงื่อนไขว่าใครจะใช้ตรรกะ combinatoryแทนแลมบ์ดาแคลคูลัส ? การอ้างอิงใด ๆ จะได้รับการชื่นชม

5
มีระบบตรวจสอบอย่างเป็นทางการที่มีคำอธิบายประกอบสำหรับภาษาการเขียนโปรแกรมที่ใช้งานได้จริงหรือไม่?
ACSL (ภาษาข้อกำหนดของ Ansi C) เป็นข้อกำหนดสำหรับรหัส C ซึ่งมีหมายเหตุประกอบเป็นความคิดเห็นพิเศษที่ช่วยให้สามารถตรวจสอบรหัส C ได้อย่างเป็นทางการ ฉันไม่ได้ดูมัน แต่ฉันคิดว่าวิธีการอย่างเป็นทางการที่ใช้ในการตรวจสอบACSLจะคล้ายกับ Hoare Logic สำหรับภาษาที่ใช้งานได้จริงเช่น Haskell ฉันไม่สามารถจินตนาการได้ว่าจะใช้วิธีการแบบใดในการยืนยันที่เป็นทางการ มีใครทำสิ่งที่คล้ายกับACSLแต่สำหรับภาษาทำงานบริสุทธิ์? ถ้าไม่ได้มีการวิจัยใด ๆ เกี่ยวกับการตรวจสอบอย่างเป็นทางการในรูปแบบคำอธิบายประกอบข้อมูลจำเพาะสำหรับภาษาทำงาน ฉันรู้ว่ามีการพิมพ์ที่ต้องพึ่งพาซึ่งรองรับหลายภาษา (Agda, Idris, ฯลฯ ... ) แต่ในการพิมพ์ที่ขึ้นอยู่กับ Haskell นั้นเป็นเรื่องยากโดยไม่ต้องใช้ตัวช่วยพิมพ์ (ไม่สามารถอ่านได้บ้าง) ด้วยความคิดนั้นและเนื่องจาก Haskell มีการสนับสนุนห้องสมุดที่ดีกว่า Agda และ Idris ฉันจึงเชื่อว่าระบบดังกล่าวสำหรับการตรวจสอบการทำงานอย่างเป็นทางการอาจมีประโยชน์ แต่ฉันไม่ทราบว่ามีการทำวิจัยนี้หรือไม่

1
สิ่งที่เป็นปัญหาในทางปฏิบัติกับทางแยกและสหภาพประเภทคืออะไร?
ฉันกำลังออกแบบภาษาการเขียนโปรแกรมฟังก์ชั่นแบบเรียบง่ายที่พิมพ์ได้ง่ายเป็นประสบการณ์การเรียนรู้ ดูเหมือนว่าระบบประเภทที่ฉันได้นำไปใช้จนถึงตอนนี้ (มีงานเพิ่มเติมเล็กน้อย) รวมประเภทการแยกและสหภาพเข้าด้วยกันเช่นคุณอาจมี: <Union String Integer> <Union Integer Foo> จุดตัดของทั้งสองประเภทด้านบนจะเป็นที่ราบ Integer สหภาพของทั้งสองประเภทจะเป็น <Union String Integer Foo> ความจริงที่ว่านี่เป็นไปได้แน่นอนไม่จำเป็นต้องหมายความว่ามันเป็นแนวคิดการออกแบบที่ดี โดยเฉพาะอย่างยิ่งฉันค่อนข้างกังวลเกี่ยวกับความยากลำบากในการใช้งานของการรักษาประเภทไม่ปะติดปะต่อและ / หรือการจัดการการทับซ้อน ข้อดี / ข้อเสียของการรวมคุณสมบัติดังกล่าวในระบบพิมพ์คืออะไร?

2
ค่าใช้จ่ายของ GC จะถูกเพิกเฉยเมื่อวิเคราะห์เวลาทำงานของโครงสร้างข้อมูลกรณีที่เลวร้ายที่สุดที่ระบุในภาษาการเขียนโปรแกรมที่เก็บขยะหรือไม่?
ฉันเพิ่งรู้ว่าฉันได้สมมติว่าคำตอบสำหรับคำถามของฉันคือ "ใช่" แต่ฉันไม่มีเหตุผลที่ดี ฉันคิดว่าอาจมีตัวเก็บขยะที่แนะนำการชะลอตัวของกรณีเลวร้ายที่สุดเท่านั้น มีการอ้างอิงที่ชัดเจนที่ฉันสามารถอ้างอิงได้หรือไม่? ในกรณีของฉันฉันกำลังทำงานกับโครงสร้างข้อมูลที่ใช้งานได้จริงและฉันใช้ Standard ML หากรายละเอียดเหล่านี้มีความสำคัญO(1)O(1)O(1) และบางทีคำถามนี้อาจมีความเกี่ยวข้องมากขึ้นเมื่อนำไปใช้กับโครงสร้างข้อมูลที่ระบุใน, พูด, Java? อาจมีการอภิปรายที่เกี่ยวข้องในตำราเรียนอัลกอริทึม / โครงสร้างข้อมูลที่ใช้ Java? (ฉันรู้ว่า Sedgewick มีรุ่น Java แต่ฉันสามารถเข้าถึงรุ่น C เท่านั้น)

2
ขีด จำกัด ของการเขียนโปรแกรมฟังก์ชั่นรวมคืออะไร?
อะไรคือข้อ จำกัด ของการตั้งโปรแกรมการทำงานทั้งหมด? ไม่สมบูรณ์ทัวริง แต่ยังคงสนับสนุนชุดย่อยที่มีขนาดใหญ่ของโปรแกรมที่เป็นไปได้ มีโครงสร้างที่สำคัญที่คุณสามารถเขียนในภาษาทัวริงที่สมบูรณ์ แต่ไม่ใช่ในภาษาที่ใช้งานได้ทั้งหมดหรือไม่? และถูกต้องหรือไม่ที่จะบอกว่าโปรแกรมที่เขียนในภาษาที่ใช้งานได้ทั้งหมดสามารถวิเคราะห์แบบคงที่ได้อย่างสมบูรณ์ในขณะที่การวิเคราะห์แบบคงที่ในภาษาทัวริงที่สมบูรณ์นั้นถูก จำกัด ด้วยสิ่งต่าง ๆ เช่นปัญหาการหยุดชะงัก ด้วยที่ฉันไม่ได้หมายความว่าในภาษาการทำงานทั้งหมดทุกอย่างสามารถกำหนด staticaly เพราะบางสิ่งเป็นที่รู้จักกันเท่านั้นที่รันไทม์ แต่ฉันหมายความว่าในทางทฤษฎีโปรแกรมที่เขียนในภาษาการเขียนโปรแกรมฟังก์ชั่นการทำงานในอุดมคติทั้งหมดสามารถวิเคราะห์เพื่อให้ทุกอย่างที่ ในทางทฤษฎีจะถูกกำหนดแบบคงที่สามารถกำหนดแบบคงที่ หรือยังมีปัญหา undecidable ที่สืบทอดในภาษาหน้าที่ทั้งหมดที่ทำให้การวิเคราะห์แบบสแตติกไม่สมบูรณ์? ปัญหาบางอย่างจะไม่สามารถตัดสินใจได้เสมอไม่ว่าจะเขียนด้วยภาษาใดก็ตาม แต่ฉันสนใจในปัญหาดังกล่าวที่สืบทอดมาจากภาษา

2
หมวดหมู่ทฤษฎีความซับซ้อนในการคำนวณและการเชื่อมต่อคอมบิเนทีฟ
ฉันพยายามอ่าน“ การออกแบบอัลกอริธึมเชิงฟังก์ชัน ” และต่อมา“ พีชคณิตของการเขียนโปรแกรม ” และมีการติดต่อที่ชัดเจนระหว่างชนิดข้อมูลที่กำหนดซ้ำ (และ polynomially) และวัตถุ combinatorial โดยมีนิยามแบบเรียกซ้ำและต่อมาเป็นผู้นำ ในซีรี่ส์พลังที่เป็นทางการเดียวกัน (หรือการสร้างฟังก์ชั่น) ดังที่แสดงไว้ในบทนำของสปีชีส์ combinatorial (ฉันอ่าน "สปีชี่และผู้รอบรู้และประเภท, โอ้มาย! ") ดังนั้นสำหรับคำถามแรกมีวิธีการกู้คืนสมการสร้าง (เรียกซ้ำ) จากชุดพลังงานหรือไม่? นั่นคือความคิดในภายหลัง ฉันสนใจแนวคิดของ algebras เริ่มต้นและ co-algebras สุดท้ายในรูปแบบของ“ การกำหนดขั้นตอนเกี่ยวกับโครงสร้างข้อมูล” มีกฎในทางปฏิบัติบางประการในการเขียนโปรแกรมเชิงฟังก์ชันที่เกี่ยวข้องกับองค์ประกอบผลิตภัณฑ์ของการทำแผนที่ระหว่างจีบราส์และที่คล้ายกันซึ่งได้อธิบายไว้ตัวอย่างในบทช่วยสอนนี้. สำหรับฉันแล้วดูเหมือนว่านี่อาจเป็นวิธีที่ทรงพลังทีเดียวในการเข้าหาความซับซ้อนและยกตัวอย่างเช่นมันดูเหมือนตรงไปตรงมามากที่จะกู้คืนทฤษฎีบทของอาจารย์ในบริบทเช่นนั้น (ฉันหมายความว่าคุณต้องทำข้อโต้แย้งเดียวกัน และ catamorphism ที่ไม่เหมือนใครจากพีชคณิตเริ่มต้นและความจริง (ฉันเข้าใจผิด?) ว่าพีชคณิตระหว่าง A และ FA สำหรับ F-polynomial functor isomorphic ทำให้ฉันมองว่าวิธีการดังกล่าวอาจมีประโยชน์มากมายในการวิเคราะห์ความซับซ้อนของ การดำเนินงานมากกว่าโครงสร้างข้อมูล จากมุมมองของภาคปฏิบัติดูเหมือนว่ากฎฟิวชั่น (โดยทั่วไปวิธีในการเขียน morphisms …

4
ภาษาคำสั่งแตกต่างจากภาษาที่ใช้งานได้อย่างไร
ฉันกำลังอ่าน Simon Peyton Jones เรื่องการใช้งานฟังก์ชั่นการเขียนโปรแกรมภาษาและมีข้อความหนึ่งที่ทำให้ฉันประหลาดใจเล็กน้อย (หน้า 39): ในระดับที่สูงกว่ากรณีของภาษาที่จำเป็นภาษาที่ใช้งานได้ส่วนใหญ่จะเป็นรูปแบบวากยสัมพันธ์ของกันและกันโดยมีความแตกต่างทางความหมายค่อนข้างน้อย ตอนนี้เขียนในปี 1987 และความคิดของฉันในเรื่องนี้อาจได้รับอิทธิพลจากภาษาการเขียนโปรแกรมที่ทันสมัยมากขึ้นซึ่งไม่ได้อยู่ใกล้หรือเป็นที่นิยม อย่างไรก็ตามฉันพบว่ามันยากที่จะเชื่อ ตัวอย่างเช่นฉันคิดว่าภาษามิแรนดาที่ได้อธิบายไว้ (ผู้บุกเบิกยุคแรกของ Haskell) มีความหมายที่แตกต่างกันมากเมื่อเทียบกับภาษาที่เข้มงวดเช่น ML มากกว่าคำว่า C ถึง Pascal หรือบางทีแม้แต่ C C ++ ให้การตรวจสอบจุดของเขาบางอย่าง :-) แต่จากนั้นอีกครั้งฉันกำลังใช้ความเข้าใจอย่างถ่องแท้ Simon Peyton Jones ส่วนใหญ่ถูกต้องในการพูดแบบนี้หรือว่าเป็นประเด็นที่ถกเถียงกันอยู่?

3
ผู้อ่านพระนักเขียน
ให้CCCเป็นCCC Let (×)(×)(\times)เป็น bifunctor สินค้าที่อยู่ในCCCCในฐานะที่เป็นแมวคือ CCC เราสามารถแกง(×)(×)(\times) : curry(×):C→(C⇒C)curry(×):C→(C⇒C)curry (\times) : C \rightarrow(C \Rightarrow C) curry(×)A=λB.A×Bcurry(×)A=λB.A×Bcurry (\times) A = \lambda B. A \times B หมวด Functor C⇒CC⇒CC \Rightarrow Cมีโครงสร้างแบบ monoidal ปกติ หนังสือในC⇒CC⇒CC \Rightarrow Cเป็น monad ในCCCC เราพิจารณาผลิตภัณฑ์ จำกัด เป็นโครงสร้าง monoidal ในCCCC curry(×)1≅idcurry(×)1≅idcurry (\times) 1 \cong id ∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)\forall A\ …

3
เริ่มต้นโครงสร้างโครงสร้างต้นไม้
หลังจากทำงานกับต้นไม้ 2-3 นิ้วมาสักพักฉันก็รู้สึกประทับใจกับความเร็วในการทำงานส่วนใหญ่ อย่างไรก็ตามปัญหาเดียวที่ฉันพบคือค่าใช้จ่ายขนาดใหญ่ที่เกี่ยวข้องกับการสร้างต้นนิ้วขนาดใหญ่ เนื่องจากการสร้างถูกกำหนดเป็นลำดับของการดำเนินการต่อกันคุณจะต้องสร้างโครงสร้างต้นไม้นิ้วจำนวนมากที่ไม่จำเป็น ด้วยลักษณะที่ซับซ้อนของต้นไม้ 2-3 นิ้วฉันจึงไม่เห็นวิธีการที่ใช้งานง่ายในการบู๊ตพวกเขาและการค้นหาทั้งหมดของฉันว่างเปล่า ดังนั้นคำถามคือคุณจะไปเกี่ยวกับการบูทต้นไม้ขนาด 2-3 นิ้วโดยมีค่าใช้จ่ายน้อยที่สุดได้อย่างไร หากต้องการชัดเจน: กำหนดลำดับทราบความยาวnสร้างการแสดงต้นไม้นิ้วของSด้วยการดำเนินการน้อยที่สุดSSSnnnSSS วิธีที่ไร้เดียงสาที่จะประสบความสำเร็จเป็นสายต่อเนื่องในการดำเนินงานข้อเสีย (ในวรรณคดีของ 'ผู้ประกอบการ) แต่นี้จะสร้างnที่แตกต่างกันโครงสร้างต้นไม้นิ้วที่เป็นตัวแทนของชิ้นทั้งหมดของSสำหรับ[ 1 .. ฉัน ]◃◃\triangleleftnnnSSS[ 1 .. ฉัน][1 ..ผม][1..i]

2
(อย่างไร) เราสามารถค้นพบ / วิเคราะห์ปัญหา NP ในกรณีที่ไม่มีโมเดลทัวริงของการคำนวณได้อย่างไร
จากมุมมองเชิงเหตุผลทางคณิตศาสตร์ / การคำนวณเชิงนามธรรมอย่างใดอย่างหนึ่ง (แม้) จะสามารถค้นพบหรือเหตุผลเกี่ยวกับปัญหาเช่น 3-SAT, ผลรวมย่อย, พนักงานขายเดินทาง ฯลฯ หรือไม่? เราจะยังสามารถที่จะมีเหตุผลเกี่ยวกับพวกเขาในทางที่มีความหมายใด ๆ มีเพียงการทำงานมุมมอง? มันจะเป็นไปได้ไหม ฉันได้ครุ่นคิดกับคำถามนี้อย่างหมดจดจากการสอบถามตนเองเป็นส่วนหนึ่งของการเรียนรู้รูปแบบการคำนวณแคลคูลัสแลมบ์ดา ฉันเข้าใจว่าเป็น "แบบไม่ใช้สัญชาตญาณ" และนั่นเป็นสาเหตุที่ Godel ชอบโมเดลทัวริง อย่างไรก็ตามฉันแค่อยากจะรู้ว่าอะไรคือข้อ จำกัด ทางทฤษฎีที่รู้จักกันในรูปแบบการทำงานของการคำนวณนี้และมันจะเป็นอุปสรรคในการวิเคราะห์ปัญหา NP ระดับเท่าไหร่?

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