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

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

14
แอปพลิเคชันตัวอย่าง Clojure ขนาดกลาง?
มีแอปพลิเคชันตัวอย่าง Clojure ขนาดกลางที่สามารถใช้เป็นตัวอย่าง "แนวทางปฏิบัติที่ดีที่สุด" และเป็นวิธีที่ดีในการดูว่าแอปพลิเคชันดังกล่าวมีลักษณะอย่างไรในแง่ของรหัสและการจัดระเบียบรหัส เว็บแอปพลิเคชันน่าสนใจเป็นพิเศษสำหรับฉัน แต่ที่สำคัญที่สุดคือโปรแกรมทำสิ่งที่มีประโยชน์โดยทั่วไป (เช่นบล็อกการติดตามข้อผิดพลาด CMS เป็นต้น) ไม่ใช่สิ่งทางคณิตศาสตร์ที่ฉันไม่เคยต้องนำไปใช้จริง โลก (การแก้ปัญหา N-queens, การจำลองชีวิต, สร้างลำดับ Fibonacci และค่าโดยสารตามปกติของภาษาโปรแกรมฟังก์ชัน) ขอบคุณ!

1
Paramorphisms คืออะไร?
เมื่ออ่านบทความคลาสสิกนี้ฉันติดอยู่กับพารามอร์ฟิสม์ น่าเสียดายที่ส่วนนี้ค่อนข้างบางและหน้า Wikipedia ไม่ได้พูดอะไรเลย การแปล Haskell ของฉันคือ: para :: (a -> [a] -> b -> b) -> b -> [a] -> b para f base = h where h [] = base h (x:xs) = f x xs (h xs) แต่ฉันไม่เอะใจนั่น - ฉันไม่มีสัญชาตญาณใด ๆ สำหรับลายเซ็นประเภทหรือผลลัพธ์ที่ต้องการ พารามอร์ฟิสซึมคืออะไรและมีตัวอย่างใดบ้างที่เป็นประโยชน์ในการดำเนินการ ใช่ฉันเคยเห็นคำถามเหล่านี้ แต่ไม่ครอบคลุมถึงพารามอร์ฟิสโดยตรงและชี้ไปที่แหล่งข้อมูลที่อาจเป็นประโยชน์ในการอ้างอิงเท่านั้น แต่ไม่ใช่เป็นสื่อการเรียนรู้

5
เหตุใดฉันจึงไม่สามารถแมปเลขจำนวนเต็มกับสตริงเมื่อสตรีมจากอาร์เรย์ได้
รหัสนี้ใช้งานได้ (ถ่ายใน Javadoc): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); ไม่สามารถรวบรวมสิ่งนี้ได้: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEA บอกฉันว่าฉันมี "สตริงประเภทการส่งคืนที่ไม่เข้ากันในนิพจน์แลมบ์ดา" ทำไม? และจะแก้ไขอย่างไร?

10
ฉันสามารถซิปมากกว่าสองรายการพร้อมกันใน Scala ได้หรือไม่
รับรายการ Scala ต่อไปนี้: val l = List(List("a1", "b1", "c1"), List("a2", "b2", "c2"), List("a3", "b3", "c3")) ฉันจะได้รับ: List(("a1", "a2", "a3"), ("b1", "b2", "b3"), ("c1", "c2", "c3")) เนื่องจาก zip สามารถใช้เพื่อรวมสองรายการเท่านั้นฉันคิดว่าคุณจะต้องวนซ้ำ / ลดรายการหลักอย่างใด ไม่น่าแปลกใจที่สิ่งต่อไปนี้ใช้ไม่ได้: scala> l reduceLeft ((a, b) => a zip b) <console>:6: error: type mismatch; found : List[(String, String)] required: List[String] …

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

4
ฉันจะเขียนฟังก์ชันที่ส่งคืนฟังก์ชันอื่นได้อย่างไร
ใน Python ฉันต้องการเขียนฟังก์ชันmake_cylinder_volume(r)ที่ส่งคืนฟังก์ชันอื่น ฟังก์ชั่นที่ควรจะกลับ callable กับพารามิเตอร์hและกลับปริมาตรของทรงกระบอกที่มีความสูงและรัศมีhr ฉันรู้วิธีคืนค่าจากฟังก์ชันใน Python แต่ฉันจะคืนค่าฟังก์ชันอื่นได้อย่างไร

1
คำอธิบายของ Combinators สำหรับคนทำงาน
Combinator คืออะไร ?? เป็น"ฟังก์ชันหรือคำจำกัดความที่ไม่มีตัวแปรอิสระ" (ตามที่กำหนดไว้ใน SO) หรือไม่? หรือเกี่ยวกับสิ่งนี้: ตามที่John Hughes กล่าวในบทความที่รู้จักกันดีของเขาเรื่อง Arrows "Combinator คือฟังก์ชันที่สร้างส่วนย่อยของโปรแกรมจากส่วนย่อยของโปรแกรม"ซึ่งเป็นข้อได้เปรียบเพราะ "... โปรแกรมเมอร์ที่ใช้ combinators สร้างสิ่งที่ต้องการได้มาก โปรแกรมโดยอัตโนมัติแทนที่จะเขียนทุกรายละเอียดด้วยมือ ". เขากล่าวต่อไปmapและfilterเป็นสองตัวอย่างทั่วไปของตัวผสมดังกล่าว ตัวผสมบางตัวที่ตรงกับคำจำกัดความแรก: ส เค ย คนอื่น ๆ จากTo Mock a Mockingbird (ฉันอาจจะผิด - ฉันยังไม่ได้อ่านหนังสือเล่มนี้) ตัวผสมบางตัวที่ตรงกับคำจำกัดความที่สอง: แผนที่ กรอง พับ / ลด (สันนิษฐานว่า) ใด ๆ ของ >> =, เขียน, fmap ????? ฉันไม่สนใจคำจำกัดความแรก …

3
การจัดลำดับพารามิเตอร์เพื่อใช้ในการแกง
ฉันมีโค้ด refactored สองครั้งเมื่อเร็ว ๆ นี้เพื่อเปลี่ยนลำดับของพารามิเตอร์เนื่องจากมีโค้ดมากเกินไปที่แฮ็กชอบflipหรือ\x -> foo bar x 42เกิดขึ้น เมื่อออกแบบลายเซ็นฟังก์ชันหลักการใดบ้างที่จะช่วยให้ฉันใช้แกงกะหรี่ให้เกิดประโยชน์สูงสุด

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

5
Ruby ทำการเพิ่มประสิทธิภาพการโทรหางหรือไม่
ภาษาที่ใช้งานได้นำไปสู่การใช้การเรียกซ้ำเพื่อแก้ปัญหาจำนวนมากดังนั้นหลายภาษาจึงใช้ Tail Call Optimization (TCO) TCO ทำให้เกิดการเรียกใช้ฟังก์ชันจากฟังก์ชันอื่น (หรือตัวเองซึ่งในกรณีนี้คุณลักษณะนี้เรียกอีกอย่างว่า Tail Recursion Elimination ซึ่งเป็นส่วนย่อยของ TCO) เป็นขั้นตอนสุดท้ายของฟังก์ชันนั้นโดยไม่ต้องใช้สแต็กเฟรมใหม่ ซึ่งลดค่าใช้จ่ายและการใช้หน่วยความจำ เห็นได้ชัดว่า Ruby ได้ "ยืม" แนวคิดหลายอย่างจากภาษาที่ใช้งานได้ (lambdas, ฟังก์ชันเช่น map เป็นต้น) ซึ่งทำให้ฉันสงสัยว่า Ruby ทำการเพิ่มประสิทธิภาพการโทรหางหรือไม่?

9
ภาษาการเขียนโปรแกรมเชิงฟังก์ชันทำงานอย่างไร
หากภาษาโปรแกรมที่ใช้งานได้ไม่สามารถบันทึกสถานะใด ๆ ได้พวกเขาจะทำสิ่งง่ายๆเช่นการอ่านอินพุตจากผู้ใช้อย่างไร พวกเขา "จัดเก็บ" อินพุต (หรือจัดเก็บข้อมูลสำหรับเรื่องนั้นอย่างไร) ตัวอย่างเช่นสิ่งที่ C ง่ายๆนี้จะแปลเป็นภาษาโปรแกรมที่ใช้งานได้เช่น Haskell ได้อย่างไร #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (คำถามของฉันได้รับแรงบันดาลใจจากโพสต์ที่ยอดเยี่ยมนี้: "Execution in the Kingdom of Nouns" การอ่านมันทำให้ฉันเข้าใจดีขึ้นว่าการเขียนโปรแกรมเชิงวัตถุคืออะไร Java ใช้งานอย่างไรในลักษณะที่รุนแรงและภาษาโปรแกรมที่ใช้งานได้นั้นเป็นอย่างไร ตรงกันข้าม)

6
Polymorphism ใน Javascript คืออะไร?
ผมได้อ่านบทความที่เป็นไปได้บางอย่างที่ฉันสามารถพบได้บนอินเทอร์เน็ตในหลายรูปแบบ แต่ฉันคิดว่าฉันไม่สามารถเข้าใจความหมายและความสำคัญของมันได้ บทความส่วนใหญ่ไม่ได้บอกว่าเหตุใดจึงสำคัญและฉันจะบรรลุพฤติกรรมหลายรูปแบบใน OOP ได้อย่างไร (แน่นอนใน JavaScript) ฉันไม่สามารถให้ตัวอย่างโค้ดใด ๆ ได้เนื่องจากฉันไม่มีแนวคิดในการใช้งานดังนั้นคำถามของฉันอยู่ด้านล่าง มันคืออะไร? ทำไมเราถึงต้องการ? มันทำงานอย่างไร? ฉันจะบรรลุพฤติกรรมหลายรูปแบบนี้ในจาวาสคริปต์ได้อย่างไร ฉันมีตัวอย่างนี้ แต่เข้าใจได้ง่ายว่าผลของรหัสนี้จะเป็นอย่างไร ไม่ได้ให้ความคิดที่ชัดเจนเกี่ยวกับความหลากหลายของตัวเอง function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; …

1
วิธีการบีบอัดรายการในรายการ
ฉันต้องการซิปรายการต่อไปนี้: >>> zip([[1,2], [3,4], [5,6]]) [[1,3,5], [2,4,6]] สิ่งนี้สามารถทำได้ด้วยการzipใช้งานปัจจุบันก็ต่อเมื่อรายการถูกแบ่งออกเป็นแต่ละองค์ประกอบ: >>> zip([1,2], [3,4], [5,6]) (1, 3, 5), (2, 4, 6)] คิดไม่ออกว่าจะแบ่งรายการและส่งต่อองค์ประกอบแต่ละรายการไปยังzipอย่างไร ต้องการโซลูชันที่ใช้งานได้จริง

6
เหตุใดฉันจึงสามารถกำหนดโครงสร้างและคลาสภายในฟังก์ชันใน C ++ ได้
ฉันเพิ่งทำสิ่งนี้ผิดพลาดใน C ++ และมันก็ใช้ได้ ทำไมฉันถึงทำได้ int main(int argc, char** argv) { struct MyStruct { int somevalue; }; MyStruct s; s.somevalue = 5; } หลังจากทำสิ่งนี้แล้วฉันก็จำได้ว่าอ่านเคล็ดลับนี้ที่ไหนสักแห่งเมื่อนานมาแล้วว่าเป็นเครื่องมือการเขียนโปรแกรมที่ใช้งานได้ยากสำหรับ C ++ แต่ฉันจำไม่ได้ว่าทำไมมันถึงถูกต้องหรือฉันอ่านที่ไหน ยินดีต้อนรับคำตอบสำหรับคำถามใด ๆ ! หมายเหตุ: แม้ว่าเมื่อเขียนคำถามฉันไม่ได้รับการอ้างอิงใด ๆ เกี่ยวกับคำถามนี้แต่แถบด้านข้างปัจจุบันก็ชี้ให้เห็นดังนั้นฉันจะใส่ไว้ที่นี่เพื่ออ้างอิงไม่ว่าคำถามจะแตกต่างกัน แต่อาจมีประโยชน์

6
JavaScript Engine tail call (TCO) ได้รับการปรับให้เหมาะสมหรือไม่
ฉันมีอัลกอริธึมการค้นหาพา ธ แบบเรียกซ้ำหางที่ฉันติดตั้งใน JavaScript และต้องการทราบว่าเบราว์เซอร์ใด ๆ (ทั้งหมด?) อาจได้รับข้อยกเว้นสแต็กโอเวอร์

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