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

ฟังก์ชั่นการเขียนโปรแกรมเป็นกระบวนทัศน์การเขียนโปรแกรมซึ่งส่วนใหญ่ใช้ฟังก์ชั่นเป็นวิธีการในการสร้าง abstractions และแสดงการคำนวณที่ประกอบด้วยโปรแกรมคอมพิวเตอร์

4
ทำไมจึงเป็นสิ่งสำคัญสำหรับฟังก์ชั่นที่จะไม่ระบุชื่อในแลมบ์ดาแคลคูลัส?
ฉันกำลังดูการบรรยายของ Jim Weirich หัวข้อ ' Adventures in Functional Programming ' ในการบรรยายครั้งนี้เขาแนะนำแนวคิดของ Y-combinators ซึ่งโดยพื้นฐานแล้วพบว่าจุดคงที่สำหรับฟังก์ชันลำดับที่สูงขึ้น แรงจูงใจอย่างหนึ่งที่เขากล่าวถึงคือสามารถแสดงฟังก์ชันแบบเรียกซ้ำโดยใช้แลมบ์ดาแคลคูลัสเพื่อให้ทฤษฎีโดยคริสตจักร (สิ่งที่คำนวณได้อย่างมีประสิทธิภาพสามารถคำนวณได้โดยใช้แคลคูลัสแลมด้า) ปัญหาก็คือฟังก์ชั่นไม่สามารถเรียกตัวเองได้อย่างง่าย ๆ เพราะแคลคูลัสแลมบ์ดาไม่อนุญาตให้ใช้ฟังก์ชั่นที่ตั้งชื่อเช่น n(x,y)=x+yn(x,y)=x+Yn(x, y) = x + y ไม่สามารถรับชื่อ ' ' ได้จะต้องกำหนดโดยไม่ระบุชื่อ:nnn ( x ,y)→x+y(x,y)→x+y(x, y) \rightarrow x + y ทำไมการแคลคูลัสแลมบ์ดาจึงมีฟังก์ชั่นที่ไม่มีชื่อ หลักการใดที่ถูกละเมิดหากมีฟังก์ชั่นที่มีชื่อ? หรือว่าฉันเพิ่งเข้าใจผิดวิดีโอของจิม

3
ฟังก์ชัน ML ของประเภท 'a ->' b
อาจารย์ของเราขอให้เราคิดถึงฟังก์ชั่นใน OCaml ที่มีรูปแบบ 'a -> 'b เช่นฟังก์ชั่นของอาร์กิวเมนต์หนึ่งตัวที่อาจเป็นอะไรก็ได้และสามารถคืนสิ่งที่แตกต่างออกไปได้ ฉันคิดว่าจะใช้raiseในฟังก์ชั่นที่ไม่สนใจอาร์กิวเมนต์: let f x = raise Exit แต่อาจารย์กล่าวว่ามีวิธีแก้ปัญหาที่ไม่ต้องการฟังก์ชันใด ๆ ในไลบรารีมาตรฐาน ฉันสับสน: คุณจะสร้างได้'bอย่างไรถ้าคุณไม่มีในตอนแรก ฉันถามที่นี่มากกว่า Stack Overflow เพราะฉันต้องการที่จะเข้าใจสิ่งที่เกิดขึ้นฉันไม่ต้องการเพียงแค่เห็นโปรแกรมที่ไม่มีคำอธิบาย

3
วิธีทำ homoiconic ภาษา
ตามบทความนี้บรรทัดของเสียงกระเพื่อมพิมพ์ "Hello world" ไปยังเอาต์พุตมาตรฐาน (format t "hello, world") เสียงกระเพื่อมซึ่งเป็นภาษา homoiconicสามารถรักษารหัสเป็นข้อมูลด้วยวิธีนี้: ตอนนี้จินตนาการว่าเราเขียนมาโครต่อไปนี้: (defmacro backwards (expr) (reverse expr)) ย้อนกลับเป็นชื่อของแมโครซึ่งใช้นิพจน์ (แสดงเป็นรายการ) และย้อนกลับ นี่คือ "สวัสดีโลก" อีกครั้งคราวนี้ใช้มาโคร: (backwards ("hello, world" t format)) เมื่อคอมไพเลอร์เสียงกระเพื่อมเห็นบรรทัดของรหัสนั้นมันจะดูที่อะตอมแรกในรายการ ( backwards) และสังเกตว่ามันตั้งชื่อแมโคร มันจะส่งรายการที่ไม่ได้ประเมินค่า("hello, world" t format)ไปยังแมโครซึ่งจัดเรียงรายการ(format t "hello, world")ใหม่เป็น รายการผลลัพธ์แทนที่นิพจน์แมโครและเป็นสิ่งที่จะถูกประเมินในเวลาทำงาน สภาพแวดล้อมเสียงกระเพื่อมจะเห็นว่าอะตอมแรก ( format) เป็นฟังก์ชั่นและประเมินมันส่งผ่านข้อโต้แย้งที่เหลือ ในเสียงกระเพื่อมบรรลุภารกิจนี้เป็นเรื่องง่าย (แก้ไขฉันถ้าฉันผิด) เพราะรหัสจะดำเนินการตามรายการ ( s- นิพจน์ ?) …

3
ศึกษาทฤษฎีภาษาโปรแกรม
เมื่อไม่นานมานี้ฉันมีความสนใจอย่างมากในการทำความเข้าใจและพิสูจน์แง่มุมของภาษาโปรแกรม (หน้าที่) อย่างไรก็ตามในขณะที่ฉันดำดิ่งลงไปสิ่งต่าง ๆ เช่นแคลคูลัสทฤษฎีหมวดหมู่และความหมายเชิง Denotational นั้นค่อนข้างยากที่จะติดตามโดยไม่มีคำอธิบายที่เหมาะสมλλ\lambda ฉันอ่าน SICP (ค่อนข้างเป็นหนังสือที่รู้แจ้ง) แต่ฉันต้องการดำน้ำลึกลงไปในทฤษฎีของการเขียนโปรแกรมเชิงฟังก์ชั่น มีหนังสือ / บล็อก / ไซต์ / คุณชื่อมันที่จะหารือทฤษฎีของภาษาโปรแกรมการทำงานจากพื้นดินขึ้นหรือไม่

1
ไม่มีโมเดลเชิงทฤษฎีเซตของแคลคูลัส Polymorphic ที่ไร้เดียงสา?
ในกระดาษของ Philip Wadler เกี่ยวกับทฤษฎีบทฟรีเขากล่าวในหัวข้อที่ 2 เกี่ยวกับ Parametricity ว่า ไม่มีโมเดลเชิงทฤษฎีที่ไร้เดียงสาของแคลคูลัส polymorphic แลมบ์ดา ในรูปแบบโมเดลซื่อๆทางทฤษฎีคือเซตและฟังก์ชันเป็นฟังก์ชันเซตทฤษฎีซึ่งดูเหมือนสมเหตุสมผล แล้วทำไมเขาถึงบอกว่าไม่มีโมเดลแคลคูลัสเชิงพหุนามของแลมบ์ดา polymorphic ไร้เดียงสา?

3
ซีพียูที่ออกแบบมาเพื่อการเขียนโปรแกรมฟังก์ชั่นจะแตกต่างกันอย่างไร
ซีพียูมีขอบเขตที่ออกแบบโดยคำนึงถึงซอฟต์แวร์ที่ผู้คนจะเขียนให้โดยปริยายหรือโดยชัดแจ้ง ดูเหมือนว่าถ้าคุณดูที่การออกแบบชุดสถาปัตยกรรมของชุดคำสั่งพวกเขามีความ "จำเป็น" ในแง่ที่ว่าแต่ละคำสั่งนั้นเข้ารหัสคำสั่งสไตล์ที่จำเป็น สำหรับฉันแล้วดูเหมือนว่าชุดคำสั่งสถาปัตยกรรมปัจจุบันได้พัฒนาขึ้นมาบางส่วนโดยขึ้นอยู่กับประเภทของการเขียนโปรแกรมโค้ด ถ้าใครจะออกแบบ CPU จากศูนย์รู้ว่ามันจะใช้งานโปรแกรมที่เขียนในรูปแบบการเขียนโปรแกรมที่ใช้งานได้เท่านั้น CPU นั้นจะออกแบบให้แตกต่างจาก CPU ที่มีอยู่ได้อย่างไร

2
มีเอกสารที่ผ่านการตรวจสอบโดยผู้เชี่ยวชาญเพื่อศึกษาข้อดีข้อเสียของการเขียนโปรแกรมเชิงหน้าที่หรือไม่?
ใครบางคนสามารถแนะนำให้ฉันดูเอกสารที่ผ่านการตรวจสอบโดยการศึกษาข้อดีหรือข้อเสียของการเขียนโค้ดในรูปแบบการทำงานได้หรือไม่? มีเอกสารที่พูดถึงการใช้งานของแลมบ์ดาแคลคูลัสในสาขาต่าง ๆ เช่นการเรียนรู้ของเครื่องการออกแบบภาษา ฯลฯ หรือไม่?

2
มีทฤษฎี / นามธรรมหลัง OOP หรือไม่?
ฟังก์ชั่นการเขียนโปรแกรมมีแลมบ์ดาแคลคูลัสที่สง่างามและตัวแปรในฐานะทฤษฎีสำรอง มีสิ่งนี้สำหรับ OOP หรือไม่? นามธรรมสำหรับแบบจำลองเชิงวัตถุคืออะไร

2
ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นนั้นให้พลังกับการเขียนโปรแกรมฟังก์ชั่นมากกว่าหรือไม่?
ผมเคยถามคำถามที่คล้ายกันใน cstheory.SE ตามคำตอบเกี่ยวกับเรื่องนี้ Stackoverflowมีขั้นตอนวิธีว่าในวันที่ไม่ได้ขี้เกียจบริสุทธิ์ภาษาเขียนโปรแกรมการทำงานมีความซับซ้อนในขณะที่วิธีเดียวกันในการเขียนโปรแกรมที่จำเป็นคือΩ ( n ) เพิ่ม lazyness ภาษา FP จะทำให้ขั้นตอนวิธีΩ ( n )Ω ( n บันทึกn )Ω(nlog⁡n)\Omega(n \log n)Ω ( n )Ω(n)\Omega(n)Ω ( n )Ω(n)\Omega(n) มีความสัมพันธ์ที่เท่าเทียมกันเปรียบเทียบภาษา FP กับและไม่มีฟังก์ชั่นการสั่งซื้อที่สูงขึ้นหรือไม่ ทัวริงยังสมบูรณ์อยู่หรือไม่? ถ้าเป็นเช่นนั้นการขาดลำดับที่สูงขึ้นของ FP จะทำให้ภาษามีประสิทธิภาพน้อยลงหรือมีประสิทธิภาพหรือไม่

2
สถาปัตยกรรมซีพียูมีอคติต่อการดำเนินการตามขั้นตอนหรือไม่?
มีการเปลี่ยนแปลงใด ๆ ที่ทำให้ซีพียูทำงานได้ดีขึ้นสำหรับรันไทม์ที่เกิดขึ้นพร้อมกันเช่น Rust หรือไม่? ตัวอย่างเช่นมีการเปลี่ยนแปลงการนำไปใช้การทำนายสาขาหรือขนาดแคชที่จะช่วยรันไทม์พร้อมกันหรือไม่ ฉันรู้สึกว่าการออกแบบ CPU ในปัจจุบันอาจได้รับการปรับให้เหมาะสมยิ่งขึ้นสำหรับ runtimes แบบโพรซีเดอร์เช่น C หากเราต้องการปรับให้เหมาะสมสำหรับ runtimes ที่เกิดขึ้นพร้อมกัน CPU จะดูแตกต่างกันอย่างไร สำหรับ isntance การคาดคะเนสาขาถูกนำมาใช้บนพื้นฐานของการสรุปทั่วไปในเอกสารงานวิจัยที่วิเคราะห์รหัสขั้นตอน ฉันสงสัยว่าสิ่งที่เป็นนามธรรมที่เกิดขึ้นพร้อมกันจะเพิ่มชุดการทำงานที่สำคัญให้กับรันไทม์ที่ส่งผลเสียต่ออัลกอริทึมการทำนายสาขาที่มีอยู่หรือไม่ ตัวอย่างเช่นการคาดการณ์ใน for for loop เป็นสิ่งหนึ่ง แต่เมื่อเป้าหมายของสาขาเป็นส่วนใหม่ของหน่วยความจำเสมอ (กราฟิก, ข้อความ, ฯลฯ ) มันจะเป็นแคชที่พลาดเสมอและจะไม่มีสาขา ประวัติศาสตร์สำหรับมัน - เพราะยังไม่ได้แตะต้องเลย นี่อาจเป็นคำถามที่งี่เง่าเพราะเนื้อหาแม้ว่ามันอาจจะอยู่ใน RAM เสมอ แต่จะถูกแยกเป็นลำดับความสำคัญน้อยกว่าที่จะใช้ (เมื่อโหลดไปยังแคช) ... แต่ยังมี ควรเป็นขอบเขตชั่วคราวที่สามารถสังเกตได้กับบริบทที่เก็บไว้ในแคชและตัวทำนายสาขาในรันไทม์ของขั้นตอนซึ่งจะแสดงให้เห็นว่าเป็นนามธรรม - ขอบเขตในสภาพแวดล้อมที่ขนานกันมากขึ้น ดังนั้นฉันสงสัย ... มีการปฏิบัติตามขอบเขตเหล่านี้หรือไม่? มีงานวิจัยใดบ้างที่วิเคราะห์สิ่งนี้? สถาปัตยกรรมของ …

1
IO monad ทางเทคนิคไม่ถูกต้องหรือไม่?
บนวิกิ Haskell มีตัวอย่างต่อไปของการใช้งานตามเงื่อนไขของ IO monad (ดูที่นี่) when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) โปรดทราบว่าในตัวอย่างนี้คำจำกัดความของIO aถูกนำไปใช้RealWorld -> (a, RealWorld)เพื่อทำให้ทุกอย่างเข้าใจง่ายขึ้น ตัวอย่างนี้เรียกใช้การกระทำใน IO monad แบบมีเงื่อนไข ตอนนี้สมมติว่านั่นconditionคือFalseการกระทำที่actionไม่ควรดำเนินการ ใช้ความหมายสันหลังยาวนี่จะเป็นกรณี อย่างไรก็ตามมีการบันทึกไว้ที่นี่ว่า Haskell พูดถึงเทคนิคที่ไม่เข้มงวด ซึ่งหมายความว่าคอมไพเลอร์ได้รับอนุญาตให้รันaction worldบนเธรดอื่นที่แตกต่างกันและจากนั้นทิ้งการคำนวณนั้นเมื่อพบว่าไม่ได้ต้องการมัน อย่างไรก็ตามตามจุดนั้นผลข้างเคียงจะเกิดขึ้นแล้ว ในตอนนี้เราอาจนำ IO monad ไปใช้ในลักษณะที่ผลข้างเคียงจะแพร่กระจายเมื่อโปรแกรมทั้งหมดเสร็จสิ้นและเรารู้ว่าควรใช้ผลข้างเคียงใด อย่างไรก็ตามนี่ไม่ใช่กรณีเนื่องจากเป็นไปได้ที่จะเขียนโปรแกรมที่ไม่มีที่สิ้นสุดใน …

3
'การทำลายป่า' ลบ 'ต้นไม้' ออกจากโปรแกรมอย่างไร
ฉันคิดว่าเข้าใจว่าการตัดไม้ทำลายป่าใช้งานและสร้างรายการได้อย่างไรในเวลาเดียวกัน (จากการพับและฟังก์ชั่นการขยาย - ดูคำตอบที่ดีใน CodeReview ที่นี่ ) แต่เมื่อฉันเปรียบเทียบกับรายการ wikipedia เกี่ยวกับเทคนิคที่พูดถึง ต้นไม้ 'จากโปรแกรม ฉันเข้าใจว่าโปรแกรมสามารถแยกวิเคราะห์ลงในแผนผังวากยสัมพันธ์ (ถูกไหม?) แต่อะไรคือความหมายของการใช้การตัดไม้ทำลายป่าเพื่อความเรียบง่าย (มันคืออะไร) ของโปรแกรม? และฉันจะทำอย่างไรกับรหัสของฉัน?

1
คุณสมบัติเช่นการใช้หน่วยความจำของฟังก์ชันสามารถแสดงเป็นภาษาที่พิมพ์ได้หรือไม่?
สมมติว่าเราต้องการเหตุผลเกี่ยวกับคุณสมบัติของรหัสนอกเหนือจากสิ่งต่าง ๆ เช่นจำนวนทั้งสิ้นและความบริสุทธิ์ในการใช้งาน - เรายังใส่ใจเกี่ยวกับการใช้หน่วยความจำหรือความซับซ้อนของอัลกอริทึมของฟังก์ชัน สามารถทำได้ผ่านระบบการพิมพ์และเอฟเฟกต์แบบพึ่งพาหรือไม่

2
การใช้งานโครงสร้างข้อมูลแบบไม่คงที่ (ถาวร) เหมือนอาร์เรย์ที่มีการจัดทำดัชนีอย่างรวดเร็วผนวกผนวกซ้ำ
ฉันกำลังมองหาโครงสร้างข้อมูลถาวรคล้ายกับอาเรย์ (แต่ไม่เปลี่ยนรูป) ให้การดำเนินการจัดทำดัชนีอย่างรวดเร็วผนวกต่อเติมและทำซ้ำ (ตำแหน่งที่ดี) Clojure ให้ Vector แบบถาวร แต่มันเป็นเพียงการผนวกที่รวดเร็วเท่านั้น เวกเตอร์ของ Scala มีการเพิ่มและต่อเติมอย่างต่อเนื่องอย่างมีประสิทธิภาพ แต่ฉันไม่สามารถนำมาใช้ได้เนื่องจากมันขึ้นอยู่กับโครงสร้างข้อมูลเดียวกัน (bit-mapped vector trie) เป็นเวกเตอร์ Clojure และอย่างที่ฉันเข้าใจ trie เวกเตอร์บิตแมป ไม่สามารถเพิ่มความเร็วได้อย่างรวดเร็วหากไม่มีเทคนิคบางอย่าง ฉันสนใจที่จะไม่พร้อมใช้งานการใช้งาน แต่ในรายละเอียดของวิธีการใช้โครงสร้างข้อมูลดังกล่าวด้วยตนเอง

1
แนวทาง“ CPS” ได้สร้างความเสียหายอย่างมากต่อประสิทธิภาพใน SML / NJ เหตุผลที่ต้องการ
ในความคิดเห็นต่อการเรียนรู้ F #: หนังสือที่ใช้ภาษาการเขียนโปรแกรมอื่นใดที่สามารถแปลเป็น F # เพื่อเรียนรู้แนวคิดการทำงานได้ Makariusระบุ: โปรดทราบว่าวิธีการ "CPS" ได้สร้างความเสียหายอย่างมากต่อประสิทธิภาพการทำงานใน SML / NJ รูปแบบการประเมินผลทางกายภาพของมันละเมิดสมมติฐานมากเกินไปที่สร้างขึ้นในฮาร์ดแวร์ หากคุณใช้แอปพลิเคชันสัญลักษณ์ขนาดใหญ่ของ SML เช่น Isabelle / HOL SML / NJ พร้อม CPS จะแสดงผลประมาณ ช้ากว่าโพลี / ML 100 เท่าด้วยสแต็กธรรมดา มีคนอธิบายเหตุผลนี้ได้ไหม (โดยเฉพาะอย่างยิ่งกับตัวอย่าง) มีความต้านทานไม่ตรงกันที่นี่หรือไม่?

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