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

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

10
ฐานข้อมูลและการเขียนโปรแกรมเชิงฟังก์ชันมีความขัดแย้งกันหรือไม่?
ฉันเป็นนักพัฒนาเว็บมาระยะหนึ่งแล้วและเพิ่งเริ่มเรียนรู้การเขียนโปรแกรมเชิงฟังก์ชันบางอย่าง เช่นเดียวกับคนอื่น ๆ ฉันมีปัญหาสำคัญบางประการในการนำแนวคิดเหล่านี้ไปใช้กับงานวิชาชีพของฉัน สำหรับฉันเหตุผลหลักคือฉันเห็นความขัดแย้งระหว่างเป้าหมายของ FP ในเรื่องการไร้สัญชาติที่เหลืออยู่นั้นค่อนข้างขัดแย้งกับความจริงที่ว่างานพัฒนาเว็บส่วนใหญ่ที่ฉันทำนั้นมีความเชื่อมโยงกับฐานข้อมูลอย่างมากซึ่งมีข้อมูลเป็นศูนย์กลาง สิ่งหนึ่งที่ทำให้ฉันเป็นนักพัฒนาที่มีประสิทธิผลมากขึ้นในด้าน OOP คือการค้นพบตัวทำแผนที่เชิงสัมพันธ์เชิงวัตถุเช่น MyGeneration d00dads สำหรับ. Net, Class :: DBI สำหรับ perl, ActiveRecord สำหรับทับทิม ฯลฯ สิ่งนี้ทำให้ฉันต้องอยู่ห่าง ๆ จากการเขียนแทรกและเลือกคำสั่งทั้งวันและมุ่งเน้นไปที่การทำงานกับข้อมูลได้อย่างง่ายดายเหมือนวัตถุ แน่นอนว่าฉันยังคงสามารถเขียนแบบสอบถาม SQL ได้เมื่อจำเป็นต้องใช้พลังงาน แต่อย่างอื่นมันก็เป็นนามธรรมเบื้องหลังอย่างดี ตอนนี้เปลี่ยนไปใช้การเขียนโปรแกรมเชิงฟังก์ชันดูเหมือนว่าสำหรับเฟรมเวิร์กเว็บ FP จำนวนมากเช่นลิงค์ต้องการการเขียนโค้ด SQL แบบสำเร็จรูปจำนวนมากดังในตัวอย่างนี้ Weblocks ดูเหมือนจะดีกว่าเล็กน้อย แต่ดูเหมือนว่าจะใช้แบบจำลอง OOP สำหรับการทำงานกับข้อมูลและยังต้องใช้โค้ดในการเขียนด้วยตนเองสำหรับแต่ละตารางในฐานข้อมูลของคุณดังตัวอย่างนี้ ฉันคิดว่าคุณใช้การสร้างโค้ดบางอย่างเพื่อเขียนฟังก์ชันการทำแผนที่เหล่านี้ แต่ดูเหมือนจะไม่เหมือนเสียงกระเพื่อม (หมายเหตุฉันไม่ได้ดู Weblocks หรือ Links อย่างใกล้ชิดมากนักฉันอาจเข้าใจผิดว่าใช้อย่างไร) ดังนั้นคำถามคือสำหรับส่วนการเข้าถึงฐานข้อมูล (ซึ่งฉันเชื่อว่ามีขนาดใหญ่พอสมควร) ของเว็บแอปพลิเคชันหรือการพัฒนาอื่น ๆ …

16
คู่มือเริ่มต้นสำหรับ Haskell? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันมองหาคำแนะนำที่ดีเกี่ยวกับ Haskell มาระยะหนึ่งแล้ว แต่ยังไม่พบคำแนะนำที่น่าสนใจพอที่จะอ่านและ / หรือเข้าท่า ฉันเคยสัมผัสกับ Haskell มาก่อนไม่กี่ปี แต่ฉันจำไม่ได้มากนัก ฉันจำคำว่า "Aha!" ได้ - รู้สึกเหลือเชื่อมากเมื่อฉันได้มันมาในที่สุดและมันก็สนุกดีที่ได้เล่นด้วยดังนั้นฉันจึงต้องการค้นพบศิลปะที่หายไปของ Haskell อีกครั้ง ฉันคุ้นเคยกับ Ruby และเทคนิคการเขียนโปรแกรมที่ใช้งานได้ดีดังนั้นฉันคิดว่าฉันไม่ได้อยู่ในความมืดอย่างสมบูรณ์ ลิงก์ใด ๆ

4
ความแตกต่างระหว่างพับและลด?
พยายามเรียนรู้ F # แต่มีสับสนเมื่อพยายามที่จะแยกแยะความแตกต่างระหว่างการพับและลด การพับดูเหมือนจะทำสิ่งเดียวกันแต่ใช้พารามิเตอร์พิเศษ มีเหตุผลอันชอบธรรมที่ทำให้ฟังก์ชันทั้งสองนี้มีอยู่หรือมีขึ้นเพื่อรองรับผู้ที่มีภูมิหลังที่แตกต่างกัน? (เช่น: สตริงและสตริงใน C #) นี่คือข้อมูลโค้ดที่คัดลอกมาจากตัวอย่าง: let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] …

22
เหตุใดการประเมินแบบขี้เกียจจึงมีประโยชน์?
ฉันสงสัยมานานแล้วว่าทำไมการประเมินแบบขี้เกียจจึงมีประโยชน์ ฉันยังไม่เคยมีใครอธิบายให้ฉันเข้าใจได้ ส่วนใหญ่จะจบลงด้วยการ "เชื่อใจฉัน" หมายเหตุ: ฉันไม่ได้หมายถึงการท่องจำ

9
อะไรคือ 'pythonic' เทียบเท่ากับฟังก์ชัน 'fold' จากการเขียนโปรแกรมเชิงฟังก์ชัน
อะไรคือวิธีที่เป็นสำนวนที่สุดในการบรรลุสิ่งต่อไปนี้ใน Haskell: foldl (+) 0 [1,2,3,4,5] --> 15 หรือเทียบเท่าใน Ruby: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 เห็นได้ชัดว่า Python มีreduceฟังก์ชันซึ่งเป็นการใช้งานแบบพับตามที่กล่าวข้างต้นอย่างไรก็ตามฉันได้รับแจ้งว่าวิธีการเขียนโปรแกรมแบบ 'pythonic' คือการหลีกเลี่ยงlambdaคำศัพท์และฟังก์ชันลำดับที่สูงกว่าโดยเลือกใช้ความเข้าใจในรายการหากเป็นไปได้ ดังนั้นจึงมีวิธีที่ดีกว่าในการพับรายการหรือโครงสร้างแบบรายการใน Python ที่ไม่ใช่reduceฟังก์ชันหรือเป็นreduceวิธีที่เป็นสำนวนในการบรรลุสิ่งนี้หรือไม่?

10
นี่เป็นฟังก์ชั่นที่บริสุทธิ์หรือเปล่า?
แหล่งที่มาส่วนใหญ่กำหนดฟังก์ชั่นที่บริสุทธิ์ว่ามีสองคุณสมบัติต่อไปนี้: ค่าส่งคืนจะเหมือนกันสำหรับอาร์กิวเมนต์เดียวกัน การประเมินผลไม่มีผลข้างเคียง มันเป็นเงื่อนไขแรกที่เกี่ยวข้องกับฉัน ในกรณีส่วนใหญ่มันง่ายที่จะตัดสิน พิจารณาฟังก์ชั่น JavaScript ต่อไปนี้ (ดังแสดงในบทความนี้ ) บริสุทธิ์: const add = (x, y) => x + y; add(2, 4); // 6 ไม่บริสุทธิ์: let x = 2; const add = (y) => { return x += y; }; add(4); // x === 6 (the first time) add(4); // …

9
เข้าใจความแตกต่างระหว่างขั้นตอนและการทำงานอย่างแท้จริง
ฉันมีช่วงเวลาที่ยากลำบากในการทำความเข้าใจความแตกต่างระหว่างกระบวนทัศน์การเขียนโปรแกรมขั้นตอนและฟังก์ชัน นี่คือสองย่อหน้าแรกจากรายการ Wikipedia เกี่ยวกับการเขียนโปรแกรมเชิงฟังก์ชัน : ในวิทยาการคอมพิวเตอร์การเขียนโปรแกรมเชิงฟังก์ชันเป็นกระบวนทัศน์การเขียนโปรแกรมที่ถือว่าการคำนวณเป็นการประเมินฟังก์ชันทางคณิตศาสตร์และหลีกเลี่ยงสถานะและข้อมูลที่ไม่แน่นอน เน้นการประยุกต์ใช้ฟังก์ชันตรงกันข้ามกับรูปแบบการเขียนโปรแกรมที่จำเป็นซึ่งเน้นการเปลี่ยนแปลงในสถานะ การเขียนโปรแกรมเชิงฟังก์ชันมีรากฐานมาจากแคลคูลัสแลมบ์ดาซึ่งเป็นระบบทางการที่พัฒนาขึ้นในช่วงทศวรรษที่ 1930 เพื่อตรวจสอบนิยามของฟังก์ชันการประยุกต์ใช้ฟังก์ชันและการเรียกซ้ำ ภาษาโปรแกรมที่ใช้งานได้หลายภาษาสามารถมองว่าเป็นรายละเอียดเกี่ยวกับแคลคูลัสแลมบ์ดา ในทางปฏิบัติความแตกต่างระหว่างฟังก์ชันทางคณิตศาสตร์และความคิดของ "ฟังก์ชัน" ที่ใช้ในการเขียนโปรแกรมที่จำเป็นคือฟังก์ชันที่จำเป็นอาจมีผลข้างเคียงทำให้ค่าสถานะของโปรแกรมเปลี่ยนไป ด้วยเหตุนี้พวกเขาจึงขาดความโปร่งใสในการอ้างอิงกล่าวคือการแสดงออกของภาษาเดียวกันอาจทำให้เกิดค่าที่แตกต่างกันในช่วงเวลาที่ต่างกันขึ้นอยู่กับสถานะของโปรแกรมการดำเนินการ ในทางกลับกันในโค้ดฟังก์ชันค่าเอาต์พุตของฟังก์ชันจะขึ้นอยู่กับอาร์กิวเมนต์ที่ป้อนให้กับฟังก์ชันเท่านั้นดังนั้นการเรียกใช้ฟังก์ชัน fสองครั้งด้วยค่าเดียวกันสำหรับอาร์กิวเมนต์xจะให้ผลลัพธ์เดียวกันf(x)ทั้งสองครั้ง การขจัดผลข้างเคียงสามารถทำให้เข้าใจและทำนายพฤติกรรมของโปรแกรมได้ง่ายขึ้นซึ่งเป็นหนึ่งในแรงจูงใจสำคัญในการพัฒนาการเขียนโปรแกรมเชิงฟังก์ชัน ในวรรค 2 ที่ระบุว่า ในทางกลับกันในโค้ดเชิงฟังก์ชันค่าเอาต์พุตของฟังก์ชันจะขึ้นอยู่กับอาร์กิวเมนต์ที่ป้อนให้กับฟังก์ชันเท่านั้นดังนั้นการเรียกใช้ฟังก์ชันfสองครั้งด้วยค่าเดียวกันสำหรับอาร์กิวเมนต์xจะให้ผลลัพธ์เดียวกันf(x)ทั้งสองครั้ง นั่นไม่ใช่กรณีเดียวกันสำหรับการเขียนโปรแกรมขั้นตอนหรือไม่? เราควรมองหาอะไรในขั้นตอนและฟังก์ชันที่โดดเด่น?

1
ทำความเข้าใจว่าทำไม Zipper ถึงเป็น Comonad
นี่คือการติดตามคำตอบสำหรับคำถามก่อนหน้าของฉัน สมมติว่าฉันต้อง map แต่ละรายการa:AของList[A]ที่จะb:Bมีฟังก์ชั่นและสร้างdef f(a:A, leftNeighbors:List[A]): BList[B] เห็นได้ชัดว่าฉันไม่สามารถโทรmapเข้ารายการได้ แต่ฉันสามารถใช้ซิปรายชื่อได้ ซิปเป็นเคอร์เซอร์เพื่อเลื่อนไปรอบ ๆ รายการ ให้การเข้าถึงองค์ประกอบปัจจุบัน ( focus) และเพื่อนบ้าน ตอนนี้ฉันสามารถแทนที่ของฉันfด้วย def f'(z:Zipper[A]):B = f(z.focus, z.left)และผ่านฟังก์ชั่นใหม่นี้f'จะใช้วิธีการcobindZipper[A] การcobindทำงานในลักษณะนี้: เรียกสิ่งนั้นf'ด้วยซิปจากนั้นเลื่อนซิปเรียกf'ด้วยซิปใหม่ "ย้าย" เลื่อนซิปอีกครั้งและอื่น ๆ ... จนกระทั่งซิปไปถึงจุดสิ้นสุดของรายการ ในที่สุดการcobindส่งคืนประเภทซิปใหม่Zipper[B]ซึ่งสามารถเปลี่ยนเป็นรายการและเพื่อให้ปัญหาได้รับการแก้ไข ตอนนี้สังเกตความสมมาตรระหว่างcobind[A](f:Zipper[A] => B):Zipper[B]และbind[A](f:A => List[B]):List[B]นั่นคือเหตุผลที่Lista MonadและZipperเป็นComonad. มันเข้าท่าไหม?

30
ผลคูณคาร์ทีเซียนของอาร์เรย์หลายรายการใน JavaScript
Наэтотвопросестьответына Stack Overflow нарусском : Декартовопроизведениенесколькихмассивов คุณจะใช้ผลิตภัณฑ์คาร์ทีเซียนของหลายอาร์เรย์ใน JavaScript ได้อย่างไร? ตัวอย่างเช่น, cartesian([1, 2], [10, 20], [100, 200, 300]) ควรกลับ [ [1, 10, 100], [1, 10, 200], [1, 10, 300], [2, 10, 100], [2, 10, 200] ... ]


17
เอะอะอะไรเกี่ยวกับ Haskell? [ปิด]
ตามที่กล่าวไว้ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันรู้จักโปรแกรมเมอร์สองสามคนที่พูดถึง Haskell เมื่อพวกเขาอยู่ด้วยกันเองและที่นี่ทุกคนดูเหมือนจะชอบภาษานั้น การเป็นคนเก่งใน Haskell ดูเหมือนจะเป็นจุดเด่นของโปรแกรมเมอร์อัจฉริยะ ใครช่วยยกตัวอย่างของ Haskell ที่แสดงให้เห็นว่าทำไมมันถึงดูสง่างาม / เหนือกว่า

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

5
รูปแบบการออกแบบตามหน้าที่ [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ มีสำนวนการใช้งานมากมาย: monads แอพพลิเคชั่นลูกศร ฯลฯ พวกเขาได้รับการบันทึกไว้ในบทความต่างๆ แต่น่าเสียดายที่ฉันไม่รู้จักหนังสือหรือบทความใด ๆ ที่พวกเขาสรุปไว้ในที่เดียว (มีTypeclassopediaแต่มีจำนวนมาก ของพื้นที่ที่ไม่ครอบคลุม) ใครช่วยแนะนำบทความ / หนังสือที่ครอบคลุมได้ดีในที่เดียวและเรื่องไหนที่โปรแกรมเมอร์ที่มีทักษะระดับกลางใน FP สามารถเข้าถึงได้

6
สไตล์“ point free” (ใน Functional Programming) คืออะไร?
วลีที่ฉันสังเกตเห็นเมื่อเร็ว ๆ นี้คือแนวคิดของสไตล์ "point free" ... อย่างแรกมีคำถามนี้และคำถามนี้ด้วย จากนั้นฉันก็ค้นพบที่นี่พวกเขากล่าวถึง "อีกหัวข้อหนึ่งที่อาจมีค่าควรพูดคุยกันคือผู้เขียนไม่ชอบสไตล์ไร้จุดมุ่งหมาย" สไตล์ "point free" คืออะไร? ใครช่วยให้คำอธิบายสั้น ๆ มันเกี่ยวข้องกับการแกงแบบ "อัตโนมัติ" หรือไม่? เพื่อให้ทราบถึงระดับของฉัน - ฉันได้สอน Scheme ด้วยตัวเองและได้เขียนล่าม Scheme แบบง่ายๆ ... ฉันเข้าใจว่าการแกง "โดยนัย" คืออะไร แต่ฉันไม่รู้จัก Haskell หรือ ML เลย

6
ฉันจะใช้การเขียนโปรแกรมเชิงฟังก์ชันในโลกแห่งความเป็นจริงได้อย่างไร? [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้นเท่านั้น ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ภาษาที่ใช้งานได้ดีเพราะหลีกเลี่ยงข้อบกพร่องโดยการกำจัดสถานะ แต่ยังเป็นเพราะสามารถขนานกันได้โดยอัตโนมัติสำหรับคุณโดยที่คุณไม่ต้องกังวลกับการนับเธรด ในฐานะนักพัฒนา Win32 ฉันสามารถใช้ Haskell สำหรับ dll ของแอปพลิเคชันของฉันได้หรือไม่? และถ้าฉันทำจะมีข้อได้เปรียบที่แท้จริงสำหรับฉันโดยอัตโนมัติหรือไม่? ถ้าเป็นเช่นนั้นอะไรที่ทำให้ฉันได้เปรียบคอมไพเลอร์นี้ F # ขนานฟังก์ชันที่คุณเขียนในหลายคอร์และซีพียูให้คุณโดยอัตโนมัติหรือไม่? คุณเคยเห็นจำนวนเธรดในตัวจัดการงานเพิ่มขึ้นหรือไม่? โดยทั่วไปคำถามของฉันคือฉันจะเริ่มใช้ Haskell ในทางปฏิบัติได้อย่างไรและฉันจะเห็นประโยชน์บางอย่างจริงหรือไม่ถ้าฉันทำ

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