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

ฟังก์ชั่นการเขียนโปรแกรมเป็นกระบวนทัศน์การเขียนโปรแกรมตามการสร้าง abstractions โดยใช้ฟังก์ชั่นหลีกเลี่ยงผลข้างเคียงและการเปลี่ยนแปลงของรัฐ การเขียนโปรแกรมใช้งานได้จริงนั้นปลอดภัยต่อเธรด

15
เขียนล่าม Haskell ใน Haskell
แบบฝึกหัดการเขียนโปรแกรมแบบคลาสสิกคือการเขียนล่าม Lisp / Scheme ใน Lisp / Scheme พลังของภาษาเต็มสามารถใช้เพื่อสร้างล่ามสำหรับส่วนย่อยของภาษา มีการออกกำลังกายที่คล้ายกันสำหรับ Haskell หรือไม่? ฉันต้องการติดตั้งชุดย่อยของ Haskell โดยใช้ Haskell เป็นเครื่องยนต์ แน่นอนว่าสามารถทำได้ แต่มีแหล่งข้อมูลออนไลน์ให้ดูหรือไม่? นี่คือเรื่องราวเบื้องหลัง ฉันกำลังสำรวจแนวคิดในการใช้ Haskell เป็นภาษาเพื่อสำรวจแนวคิดบางอย่างในหลักสูตรโครงสร้างไม่ต่อเนื่องที่ฉันกำลังสอน สำหรับภาคการศึกษานี้ฉันได้ใช้มิแรนดาซึ่งเป็นภาษาเล็ก ๆ ที่เป็นแรงบันดาลใจให้ฮัสเคลล์ มิแรนดาทำประมาณ 90% ในสิ่งที่ฉันอยากทำ แต่ Haskell ทำประมาณ 2,000% :) ดังนั้นความคิดของฉันคือการสร้างภาษาที่มีคุณสมบัติของ Haskell ที่ฉันต้องการและไม่อนุญาตอย่างอื่น ในขณะที่นักเรียนก้าวหน้าขึ้นฉันสามารถเลือก "เปิด" คุณสมบัติต่างๆได้เมื่อพวกเขาเข้าใจพื้นฐานแล้ว "ระดับภาษา" การสอนถูกนำมาใช้เพื่อสอนJavaและSchemeได้สำเร็จ ด้วยการ จำกัด สิ่งที่ทำได้คุณสามารถป้องกันไม่ให้พวกเขายิงตัวตายในขณะที่พวกเขายังคงเชี่ยวชาญไวยากรณ์และแนวคิดที่คุณพยายามสอน และคุณสามารถเสนอข้อความแสดงข้อผิดพลาดที่ดีขึ้นได้

3
สถานะของการใช้งาน Functional Reactive Programming ในปัจจุบันเป็นอย่างไร
ฉันพยายามนึกภาพระบบทางกายภาพอัตโนมัติง่ายๆ (เช่นลูกตุ้มแขนหุ่นยนต์ ฯลฯ ) ใน Haskell บ่อยครั้งที่ระบบเหล่านั้นสามารถอธิบายได้ด้วยสมการเช่น df/dt = c*f(t) + u(t) ที่u(t)แสดงถึง 'การควบคุมอัจฉริยะ' บางประเภท ระบบเหล่านี้ดูเหมือนจะเข้ากันได้ดีในกระบวนทัศน์การเขียนโปรแกรมปฏิกิริยาเชิงฟังก์ชัน ดังนั้นผมจึงคว้าหนังสือ "Haskell ของโรงเรียนในการแสดงออก" โดยพอลฮูดักและพบว่าเฉพาะโดเมนภาษา "FAL" (สำหรับฟังก์ชั่นนิเมชั่น Language) ที่นำเสนอมีการใช้งานได้จริงค่อนข้าง pleasently สำหรับระบบของเล่นที่เรียบง่ายของฉัน (แม้ว่าการทำงานบางอย่างสะดุดตาintegrate, ดูเหมือนจะขี้เกียจไปหน่อยสำหรับการใช้งานที่มีประสิทธิภาพ แต่แก้ไขได้ง่าย) คำถามของฉันคืออะไรที่เป็นทางเลือกสำหรับผู้ใหญ่ที่ทันสมัยได้รับการดูแลเป็นอย่างดีได้รับการปรับแต่งประสิทธิภาพสำหรับแอปพลิเคชันขั้นสูงหรือแม้แต่ในทางปฏิบัติในปัจจุบัน หน้าวิกินี้แสดงตัวเลือกต่างๆสำหรับ Haskell แต่ฉันไม่ชัดเจนเกี่ยวกับประเด็นต่อไปนี้: สถานะของ "ปฏิกิริยา" โครงการจาก Conal Eliott ซึ่งเป็น (ตามที่ฉันเข้าใจ) หนึ่งในผู้คิดค้นกระบวนทัศน์การเขียนโปรแกรมนี้ดูไม่ค่อยดี ฉันชอบรหัสของเขา แต่ฉันควรลองทางเลือกอื่นที่ทันสมัยกว่านี้ไหม อะไรคือความแตกต่างหลักระหว่างพวกเขาในแง่ของไวยากรณ์ / ประสิทธิภาพ / ความเสถียรของรันไทม์ หากต้องการอ้างอิงจากการสำรวจในปี 2554 …


9
ควรใช้ภาษาการเขียนโปรแกรมเชิงฟังก์ชันเมื่อใด
ในสถานการณ์ใดที่ฉันควรเลือกใช้ภาษาโปรแกรมที่ใช้งานได้กับภาษาเชิงวัตถุแบบละเอียดเช่น C ++, C # หรือ Java ฉันเข้าใจว่าการเขียนโปรแกรมเชิงฟังก์ชันคืออะไรสิ่งที่ฉันไม่เข้าใจจริงๆคือปัญหาประเภทใดจึงเป็นทางออกที่สมบูรณ์แบบ?

11
ความหมายของนามธรรมที่รั่วไหล?
คำว่า "สิ่งที่เป็นนามธรรมที่รั่วไหล" หมายความว่าอย่างไร (โปรดอธิบายด้วยตัวอย่างฉันมักจะมีปัญหาในการฟังทฤษฎีเพียงอย่างเดียว)

11
ยกเลิกก่อนกำหนด
วิธีใดที่ดีที่สุดในการยุติการพับก่อนกำหนด เป็นตัวอย่างง่ายๆสมมติว่าฉันต้องการสรุปตัวเลขใน an Iterableแต่ถ้าฉันพบสิ่งที่ฉันไม่คาดคิด (พูดเป็นเลขคี่) ฉันอาจต้องการยุติ นี่เป็นการประมาณครั้งแรก def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = { nums.foldLeft (Some(0): Option[Int]) { case (Some(s), n) if n % 2 == 0 => Some(s + n) case _ => None } } อย่างไรก็ตามวิธีการแก้ปัญหานี้ค่อนข้างน่าเกลียด (เช่นเดียวกับในกรณีที่ฉันทำก่อนหน้านี้และผลตอบแทน - มันจะสะอาดและชัดเจนกว่ามาก) และที่แย่ที่สุดก็คือมันข้ามผ่านการทำซ้ำทั้งหมดแม้ว่าจะเจอกับเลขที่ไม่ใช่คู่ก็ตาม . แล้วอะไรจะเป็นวิธีที่ดีที่สุดในการเขียนพับแบบนี้ซึ่งจะยุติก่อนเวลาอันควร? ฉันควรจะไปและเขียนสิ่งนี้ซ้ำหรือมีวิธีที่เป็นที่ยอมรับมากกว่านี้?

7
เหตุใดการเขียนคอมไพเลอร์ในภาษาที่ใช้งานได้จึงง่ายกว่า [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันคิดถึงคำถามนี้มานานมาก แต่ก็ไม่พบคำตอบใน Google และคำถามที่คล้ายกันใน Stackoverflow หากมีการซ้ำกันขออภัยด้วย หลายคนดูเหมือนจะพูดว่าการเขียนคอมไพเลอร์และเครื่องมือภาษาอื่น ๆ ในภาษาที่ใช้งานได้เช่น OCaml และ Haskell นั้นมีประสิทธิภาพมากกว่าและง่ายกว่ามากจากนั้นจึงเขียนเป็นภาษาที่จำเป็น นี่คือเรื่องจริง? และถ้าเป็นเช่นนั้น - เหตุใดจึงมีประสิทธิภาพและง่ายในการเขียนเป็นภาษาที่ใช้งานได้แทนที่จะเป็นภาษาที่จำเป็นเช่น C? นอกจากนี้ - ไม่ใช่เครื่องมือภาษาในภาษาที่ใช้งานได้ช้ากว่าในภาษาระดับต่ำเช่น C หรือไม่?


19
การเขียนโปรแกรมเชิงฟังก์ชันเกี่ยวข้องกับการพัฒนาเว็บหรือไม่ [ปิด]
ปิด . คำถามนี้ต้องการรายละเอียดหรือความคมชัด ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 เดือนที่ผ่านมา ปรับปรุงคำถามนี้ เมื่อเร็ว ๆ นี้ฉันได้เห็นเกี่ยวกับการเขียนโปรแกรมเชิงฟังก์ชันและ Clojure ดูน่าสนใจเป็นพิเศษ ในขณะที่ฉัน 'เข้าใจ' คำอธิบายพื้นฐานว่ามันคืออะไร แต่ฉันไม่สามารถเข้าใจได้ว่าฉันจะใช้มันในแต่ละวันในฐานะนักพัฒนาเว็บได้อย่างไรถ้าฉันทำได้ สิ่งที่ฉันได้อ่านจำนวนมากมุ่งเน้นไปที่ด้านคณิตศาสตร์ของการเขียนโปรแกรมเชิงฟังก์ชันแทนที่จะเป็นสถานการณ์การเขียนโปรแกรมทั่วไปที่พบใน OO ทั่วไป ฉันมีปลายไม้ผิดหรือไม่? การเขียนโปรแกรมเชิงฟังก์ชันไม่เกี่ยวข้องกับการพัฒนาเว็บโดยสิ้นเชิงหรือไม่ ถ้าไม่มีมีตัวอย่างการใช้ "สำหรับเว็บ" หรือไม่

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

2
ตรรกะเชิงผสมที่เทียบเท่ากับทฤษฎีประเภทสัญชาตญาณคืออะไร?
ฉันเพิ่งเรียนจบหลักสูตรของมหาวิทยาลัยซึ่งเป็นจุดเด่นของ Haskell และ Agda (ภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่ขึ้นอยู่กับตัวพิมพ์) และสงสัยว่าจะสามารถแทนที่แคลคูลัสแลมบ์ดาด้วยตรรกะผสมได้หรือไม่ ด้วย Haskell สิ่งนี้ดูเหมือนจะเป็นไปได้โดยใช้ตัวรวม S และ K จึงทำให้ไม่มีจุด ฉันสงสัยว่า Agda เทียบเท่ากับอะไร กล่าวคือเราสามารถสร้างภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่พิมพ์ขึ้นโดยพึ่งพา Agda โดยไม่ใช้ตัวแปรใด ๆ ได้หรือไม่? นอกจากนี้ยังสามารถแทนที่การหาปริมาณด้วยตัวผสมได้หรือไม่? ฉันไม่รู้ว่านี่เป็นเรื่องบังเอิญ แต่ตัวอย่างเช่นการหาปริมาณสากลทำให้ลายเซ็นประเภทดูเหมือนนิพจน์แลมบ์ดา มีวิธีลบการหาปริมาณสากลออกจากลายเซ็นโดยไม่เปลี่ยนความหมายหรือไม่? เช่นใน: forall a : Int -> a < 0 -> a + a < a สามารถแสดงสิ่งเดียวกันโดยไม่ใช้ forall ได้หรือไม่?

7
อะไรคือความแตกต่างระหว่าง eq?, eqv ?, เท่ากับ? และ = ใน Scheme?
ฉันสงสัยว่าความแตกต่างระหว่างการดำเนินการเหล่านั้นใน Scheme คืออะไร ฉันเคยเห็นคำถามที่คล้ายกันใน Stack Overflow แต่เป็นคำถามเกี่ยวกับ Lisp และไม่มีการเปรียบเทียบระหว่างตัวดำเนินการสามตัว ฉันกำลังเขียนคำสั่งประเภทต่างๆใน Scheme และฉันได้รับผลลัพธ์ต่อไปนี้: (eq? 5 5) -->#t (eq? 2.5 2.5) -->#f (equal? 2.5 2.5) --> #t (= 2.5 2.5) --> #t เหตุใดจึงเป็นเช่นนี้

13
คุณสามารถอธิบายการปิด (ที่เกี่ยวข้องกับ Python) ได้หรือไม่?
ฉันอ่านเกี่ยวกับการปิดตัวเองมามากและฉันคิดว่าฉันเข้าใจพวกเขา แต่หากไม่ทำให้ภาพขุ่นมัวของตัวฉันและคนอื่น ๆ ฉันหวังว่าจะมีใครสักคนอธิบายการปิดได้อย่างกระชับและชัดเจนที่สุด ฉันกำลังมองหาคำอธิบายง่ายๆที่อาจช่วยให้ฉันเข้าใจว่าที่ไหนและทำไมฉันถึงต้องการใช้

6
ฟังก์ชั่นที่บริสุทธิ์:“ ไม่มีผลข้างเคียง” หมายถึง“ ผลลัพธ์เดียวกันเสมอให้อินพุตเดียวกัน” หรือไม่?
เงื่อนไขสองประการที่กำหนดฟังก์ชันpureดังต่อไปนี้: ไม่มีผลข้างเคียง (เช่นอนุญาตให้เปลี่ยนแปลงขอบเขตเฉพาะที่เท่านั้น) ส่งคืนเอาต์พุตเดียวกันเสมอโดยให้อินพุตเดียวกัน หากเงื่อนไขแรกเป็นจริงเสมอมีบางครั้งเงื่อนไขที่สองไม่เป็นจริงหรือไม่? คือจำเป็นจริงๆกับเงื่อนไขแรกหรือไม่?

8
อะไรคือแรงจูงใจสำหรับการมอบหมายงาน Scala ที่ประเมินเป็นหน่วยแทนที่จะเป็นค่าที่กำหนด
อะไรคือแรงจูงใจสำหรับการมอบหมายงาน Scala ที่ประเมินเป็นหน่วยแทนที่จะเป็นค่าที่กำหนด รูปแบบทั่วไปในการเขียนโปรแกรม I / O คือการทำสิ่งนี้: while ((bytesRead = in.read(buffer)) != -1) { ... แต่สิ่งนี้ทำไม่ได้ในสกาล่าเพราะ ... bytesRead = in.read(buffer) .. ส่งคืนหน่วยไม่ใช่ค่าใหม่ของ bytesRead ดูเหมือนเป็นสิ่งที่น่าสนใจที่จะละเว้นจากภาษาที่ใช้งานได้ ฉันสงสัยว่าทำไมถึงทำเช่นนั้น?

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