ความเห็นที่ดีที่สุดของคุณกับการเขียนโปรแกรมการทำงานคืออะไร? [ปิด]


25

ฟังก์ชั่นการเขียนโปรแกรมเป็นหนึ่งในกระบวนทัศน์การเขียนโปรแกรมที่เก่าแก่ที่สุด อย่างไรก็ตามมันไม่ได้ใช้มากในอุตสาหกรรมเมื่อเทียบกับกระบวนทัศน์ที่เป็นที่นิยมมากขึ้น แต่ส่วนใหญ่จะเน้นในด้านวิชาการ

ความเห็นที่ดีที่สุดของคุณกับการเขียนโปรแกรมฟังก์ชั่นคืออะไร?


5
LINQ? . ผู้แทน. NET? DSL เช่น Mathematica หรือไม่
Jon Harrop

5
อนึ่งคำว่า "การเขียนโปรแกรมเชิงปฏิบัติการ" ถูกใช้โดยบุคคลต่าง ๆ เพื่อหมายถึงสิ่งต่าง ๆ ดังนั้นคุณต้องชี้แจงว่าคุณใช้ความหมายใด
Jon Harrop

2
คุณจะไม่เคยพบคนที่จะรหัสบนฐานรหัสการทำงานของคุณ ไม่ใช่การตัดสินใจทางธุรกิจที่ยอดเยี่ยมการจำกัดความสามารถของคุณ
Patrick Hughes

คำตอบ:


52

ปัญหาคือรหัสทั่วไปส่วนใหญ่เกี่ยวข้องกับสถานะ - แอพธุรกิจ, เกม, UI, ฯลฯ ไม่มีปัญหากับบางส่วนของแอพที่ใช้งานได้หมดจด อันที่จริงแล้วแอพส่วนใหญ่จะได้ประโยชน์ในพื้นที่อย่างน้อยหนึ่งแห่ง แต่การบังคับให้กระบวนทัศน์ทั่วสถานที่รู้สึกเคาน์เตอร์ง่าย


19
อย่างแน่นอน ฟังก์ชั่นการเขียนโปรแกรมฟังก์ชั่นบริสุทธิ์ไม่เหมาะสำหรับการใช้งานของรัฐ นี่คือเหตุผลที่ฉันชอบภาษาไฮบริดที่สามารถทำได้ทั้งสองอย่าง ใช้กระบวนทัศน์การทำงานสำหรับปัญหาการทำงานกระบวนทัศน์ที่จำเป็นสำหรับปัญหาที่จำเป็น
Matt Olenik

8
ตกลงกัน! รัฐเป็นส่วนสำคัญของการเขียนโปรแกรม นี่คือสาเหตุที่แม้แต่ Haskell ในบางภาษาที่บริสุทธิ์ที่สุดของภาษา FP ก็สามารถใช้ state และ IO ได้ - มันเพียงแค่แยกความแตกต่างระหว่างรหัส IO / รหัสสถานะที่ไม่แน่นอนและรหัสบริสุทธิ์ซึ่งดีมากสำหรับการทดสอบและทำความเข้าใจได้ง่าย .
Bill

8
นั่นเป็นเหตุผลที่ฉันรัก Haskell มันส่งเสริมให้ลดรหัส stateful เหล่านั้น ใน OO ฉันมุ่งมั่นที่จะเขียนซ้ำสามารถเข้าใจได้ง่ายและง่ายต่อการทดสอบโค้ด เวลาส่วนใหญ่ของฉันท้ายด้วยรหัสฉันจะไม่เขียนแตกต่างกันมากใน Haskell
LennyProgrammers

4
"มันบังคับให้แยกความแตกต่างระหว่างรหัส IO / สถานะที่ไม่แน่นอนและรหัสบริสุทธิ์ซึ่งดีมากสำหรับการทดสอบ" คุณไม่สามารถพิมพ์ข้อความดีบั๊กได้โดยไม่ต้องหลีกเลี่ยงระบบพิมพ์หรือแนะนำ monad creep
Jon Harrop

2
สันนิษฐานว่าเป็นโปรแกรมฟังก์ชั่นที่บริสุทธิ์จะทำให้โลกไม่เปลี่ยนแปลงโดยสิ้นเชิงโดยใช้มัน
Martin Beckett

24

ปัญหาเกี่ยวกับการเขียนโปรแกรมเชิงฟังก์ชั่นไม่ใช่การเขียนโปรแกรมที่ใช้งานได้เอง - เป็นคนส่วนใหญ่ที่ทำมันและ (แย่ลง) คนส่วนใหญ่ที่ออกแบบภาษาที่ต้องทำ

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

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

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

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

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


4
อาจจะมีครอสโอเวอร์ระหว่างภาษาที่ใช้งานได้มากกว่าถ้ามีภาษาที่ใช้งานได้มากกว่า
Barry Brown

5
คุณไม่สามารถ "ทำงานได้" หากปราศจากความบริสุทธิ์ เมื่อคุณก้าวข้ามเส้นความคิดทั้งหมดก็แยกจากกันและคุณก็จบลงด้วยภาษามาตรฐานที่ยุ่งเหยิงขนานและไม่มีข้อได้เปรียบใด ๆ
Patrick Hughes

7
ดังนั้นปัญหาแรกของคุณคือภาษาที่ใช้งานได้ไม่แตกต่างกันพอที่จะได้เปรียบซึ่งกันและกันและปัญหาที่สองของคุณคือพวกเขาแตกต่างกันเกินไปที่จะไปได้อย่างง่ายดาย
Tikhon Jelvis

2
สำหรับฉันคำตอบนี้อ่านเหมือนคุยโว ข้อโต้แย้งของคุณน่าสนใจกว่านี้มากถ้าคุณยกตัวอย่าง
Benjamin Hodgson

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...ไม่ว่าฟังก์ชั่น langs ขั้นตอนเหล่านี้ทั้งหมด Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python, รายการต่อไปเรื่อย ๆ - พวกเขาทั้งหมดแค่เบื่อการทำซ้ำของ C ที่ไม่แก้ปัญหาจริง นั่นเป็นความคิดเห็นที่ขาดหายไปของฉันเพื่อเติมเต็มคำตอบสำหรับคำตอบนี้: D
cat

17

ฉันคิดว่าเหตุผลที่ฟังก์ชั่นการใช้งานไม่ได้ใช้กันอย่างแพร่หลายก็เพราะมันทำให้คุณมากเกินไป ยกตัวอย่างเช่น Lisp หรือ Haskell อย่างจริงจังโดยไม่ต้องพูดว่า "ภาษาทั้งหมดนี้เป็นสิ่งที่ตรงกันข้ามอย่างยิ่งยวด" เมื่อคุณสร้าง abstractions พื้นฐานที่ coder ไม่สามารถอยู่ภายใต้เมื่อจำเป็นคุณจะสร้างสิ่งต่าง ๆ ที่ภาษาไม่สามารถทำได้และยิ่งภาษามีฟังก์ชั่นมากเท่าไหร่

ยกตัวอย่าง Haskell ในชื่อของความบริสุทธิ์ที่ใช้งานได้คุณจะต้องใช้สิ่งที่เป็นนามธรรมที่ไม่มีใครเข้าใจเพื่อจัดการสถานะและ I / O ซึ่งเป็นสองส่วนพื้นฐานที่สุดของโปรแกรมคอมพิวเตอร์ทุกโปรแกรมที่โต้ตอบกับอะไรก็ได้! นั่นเก่าเร็วแล้ว


9
+1 แม้ว่าบางครั้งฉันก็รู้สึกแบบเดียวกันเมื่อฉันเขียนโปรแกรมในภาษาที่จำเป็นระดับสูง ตัวอย่างเช่นทำไม fsck ฉันจำเป็นต้องสร้างคลาสเมธอดเดียวที่ใช้อินเตอร์เฟสเมธอดเดียวใน Java แทนการใช้ตัวชี้ฟังก์ชันเหมือนกับที่ฉันต้องการใน C
dsimcha

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

4
@dsimcha: นี่เป็นลักษณะเฉพาะของ Java มากกว่าแนวโน้มในภาษาที่จำเป็นในระดับสูง ในความเป็นจริงภาษาระดับสูงมีแนวโน้มที่จะมีฟังก์ชั่นเป็นวัตถุชั้นหนึ่ง
มูฮัมหมัด Alkarouri

3
ความจำเป็นสำหรับพระใน Haskell นั้นไม่ได้เกิดจากความบริสุทธิ์ในการใช้งาน แต่จากข้อเท็จจริงที่ว่าผลข้างเคียงและการประเมินแบบสันหลังยาวนั้นเป็นสองรสชาติที่ยอดเยี่ยมซึ่งไม่ได้มีรสชาติที่ดีเท่ากัน Monads บังคับให้ประเมินผลตามลำดับ (จริงๆพวกเขาควรจะเรียกว่าผู้สร้างการคำนวณหรือบางสิ่งบางอย่าง 'Monad' เป็นชื่อที่น่ารังเกียจสำหรับคนอื่นที่ไม่ใช่นักทฤษฎีหมวดหมู่) และคุณสามารถทำ FP อย่างมีความสุขได้โดยไม่ต้องใช้พระมหากษัตริย์!
Frank Shearar

4
สิ่งหนึ่งที่ควรทราบ: เนื่องจาก "abstraction inversions" เหล่านี้ภาษาอาจมี จำกัด มากขึ้น แต่คอมไพเลอร์และรันไทม์มีการรับประกันเพิ่มเติมเกี่ยวกับรหัสของคุณและสามารถทำได้มากกว่า นี่เป็นเหมือนการรวบรวมขยะ - ในภาษา gc คุณไม่สามารถใช้พื้นที่ malloc (ซึ่งอาจมีประโยชน์) แต่ในทางกลับกันรันไทม์สามารถจัดการหน่วยความจำทั้งหมดให้คุณได้อย่างมีประสิทธิภาพมากกว่าที่คุณสามารถทำได้ด้วยตนเอง มันเหมือนกันกับความบริสุทธิ์ที่ใช้งานได้
Tikhon Jelvis

8

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


4
นั่นเป็นจุดที่ถูกต้องตามหลักเหตุผล แต่สามารถแก้ไขได้ด้วยการ "แก้ปัญหาการเขียนโปรแกรมที่คุณพบบ่อย ๆ " ในประโยคสุดท้ายของคำถาม OP (ไม่สำคัญว่าผู้อ่านแต่ละคนจะประสบปัญหาแตกต่างกันโดยให้พวกเขาอธิบายสิ่งที่พวกเขาเป็น)
j_random_hacker

4

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

มันไม่ได้นึกไม่ถึงและคุณอาจจะได้รับมาตรฐานที่สูงขึ้นของนักพัฒนาเพราะผู้ที่จบการศึกษาจาก javaschool ที่ไม่มีทักษะการแฮ็คจริง ๆ จะไม่รู้ว่าจะเริ่มโครงการประเภทไหน แต่กลุ่มนักพัฒนาที่มีความสามารถ จำกัด จากมุมมองทางธุรกิจ


2

เวลาไปตลาด

ยากที่จะกำจัดแนว IT เต็มรูปแบบของรหัสขั้นตอนและสวดมนต์


1
โปรแกรมการทำงานมักจะง่ายต่อการทดสอบ และก็จะสั้นกว่า ไม่เห็นด้วยดังนั้น ฉันคิดว่าคุณตอบคำถามอื่น "ความคิดเห็นที่แข็งแกร่งที่สุดของคุณคือการเปลี่ยนเป็นการเขียนโปรแกรมแบบฟังก์ชั่น?"
Jonas


2

ก่อนอื่นฉันไม่ยอมรับข้อโต้แย้งใด ๆ เกี่ยวกับการเขียนโปรแกรมแบบรัฐและ fp ดู monad รัฐใน Haskell และคุณจะพบจำนวนวิธีใหม่ที่น่าสนใจในการประเมินผลกระทบของรัฐในรหัสของคุณ

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

ฉันคิดว่าคำตอบของฉันแสดงให้ฉันเห็นในฐานะแฟนบอยของ fp ฉันขอแนะนำให้ใช้ภาษา fp อย่างแท้จริงเช่นหมุนอย่างรุนแรงก่อนที่จะกังวลเกี่ยวกับการหาเหตุผลว่าทำไมคุณไม่ควร


6
ฉันคิดว่าย่อหน้าแรกของคุณจะอธิบายสิ่งที่ผิดกับความคิดของ FP เราไม่ต้องการ "วิธีการใหม่ ๆ ที่น่าสนใจในการประเมินผลกระทบของสถานะในรหัสของเรา" มันหมายความว่ายังไงเนี่ย!? เราแค่ต้องการให้รัฐอยู่ที่นั่นและสามารถเข้าถึงได้ง่ายเพราะเราต้องการให้มันเสร็จสิ้น
Mason Wheeler

2
คัมรี่ไดรฟ์ผมมีปัญหา แต่ก็ไม่จำเป็นต้องฉันไปตรวจสอบอย่างต่อเนื่องภายใต้ประทุนสำหรับการรั่วไหลของพื้นที่ Haskell เป็นเหมือนภาษาที่ดูเหมือนรถ F1 แต่จริง ๆ แล้วไม่สามารถเร่งความเร็วสูงได้ในช่วงระยะเวลาหนึ่ง :-P
j_random_hacker

1
@Mason Wheeler: "เราไม่ต้องการวิธีใหม่ที่น่าสนใจในการประเมินผลกระทบของสถานะในรหัสของเรา" เราต้องการใช้เวลาหนึ่งสัปดาห์ในการติดตามข้อผิดพลาดที่น่ารังเกียจมากเนื่องจากผลข้างเคียงที่ไม่พึงประสงค์ (ฉันพูดจากประสบการณ์ส่วนตัว)
Giorgio

@brad clawsie: ฉันคิดว่าปัญหาทั้งหมดของการควบคุมผลข้างเคียงใน FP สามารถใช้เพื่อให้โค้ดมีประสิทธิภาพมากขึ้น: ใช้เวลาในการเขียนนานกว่า แต่ใช้เวลาน้อยกว่าในการแก้ไข น่าเสียดายที่เราต้องใช้ความพยายามอย่างมากในการเรียนรู้ก่อนและโปรแกรมเมอร์จำนวนมากไม่มีความคิดระยะยาว: สิ่งต่างๆจะต้องเสร็จอย่างรวดเร็ว ไม่มีเวลาทำอย่างถูกต้องในครั้งแรก แต่มีเวลาเสมอในการดีบักและแก้ไขในภายหลัง :-)
Giorgio

@Mason Wheeler: จากมุมมองของการทำงานการมีสถานะที่ใช้ร่วมกันมีประโยชน์สำหรับการเพิ่มประสิทธิภาพเท่านั้น: การคัดลอกค่าที่ใช้เวลาและหน่วยความจำมากเกินไปดังนั้นคุณจึงแชร์วัตถุข้อมูลเพื่อหลีกเลี่ยงการคัดลอกที่ไม่จำเป็น แต่การบังคับให้รัฐที่ใช้ร่วมกันเป็นกฎจากจุดเริ่มต้นเป็นชนิดของการเพิ่มประสิทธิภาพก่อนวัยอันควร
Giorgio

2

ฉันเป็นแฟนตัวยงและเป็นผู้สนับสนุนการเขียนโปรแกรมการทำงาน แต่นี่คือคะแนนของฉัน:

  • ง่ายต่อการเรียนรู้
    ภาษาการเขียนโปรแกรมเช่นหลามและทับทิม (และภาษาอื่น ๆ อีกมากมาย) ง่ายต่อการเรียนรู้ การเขียนโปรแกรมฟังก์ชั่นขั้นสูงที่มีภาษาเช่น Haskell, Agda, Coq, ATS และอื่น ๆ ค่อนข้างยากที่จะเรียนรู้ บางคนใช้คำว่า "การเขียนโปรแกรมเชิงโครงสร้างคณิตศาสตร์" มันง่ายถ้าคุณคุ้นเคยกับทฤษฎีหมวดหมู่และคณิตศาสตร์เชิงนามธรรม แต่ค่อนข้างจะใช้ได้ถ้าคุณไม่มีเงื่อนงำอะไรเช่น "monads"

  • การเขียนโปรแกรมด้วยภาษาสคริปต์สามารถเพิ่มประสิทธิภาพการทำงานได้มากขึ้น
    ในบางสถานการณ์ที่ใช้ภาษาสคริปต์เช่น python และ ruby ​​อาจทำให้เกิดผลผลิตมากขึ้น นี่หมายถึงการสร้างต้นแบบที่รวดเร็วและการรวมแพกเกจหรือไลบรารีที่แตกต่างกัน แม้แต่การใช้ภาษาแบบไดนามิก (เช่นการเขียนโปรแกรมเชิงวัตถุแบบไดนามิก) สามารถเป็นสิ่งที่ดีในบริบทนี้ โดยทั่วไปการพิมพ์แบบสแตติกจะดีกว่า แต่การเขียนสคริปต์ด้วยประเภทแบบไดนามิกอาจมีผลในเชิงบวก

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

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

นอกจากนี้การเขียนโปรแกรมเชิงฟังก์ชันมีประโยชน์มากเมื่อการตรวจสอบอย่างเป็นทางการเป็นประโยชน์หรือจำเป็น


3
"ง่ายต่อการเรียนรู้": ฉันไม่คิดว่า Haskell จะเก่งกว่า C ++ สมัยใหม่มากนัก ฉันคิดว่าเรามักจะพิจารณาอย่างหนักในสิ่งที่เราไม่คุ้นเคย
Giorgio

1

ฉันไม่ได้ต่อต้าน FP เป็นกระบวนทัศน์ที่มีประโยชน์ แต่ฉันคัดค้านว่าเป็นกระบวนทัศน์เดียวที่มีในภาษาการเขียนโปรแกรม

มันมีข้อได้เปรียบในการแก้ปัญหาจำนวนมาก อย่างไรก็ตาม FP สามารถและได้นำไปใช้ในภาษาขั้นตอนเช่น C


เห็นด้วยกับประโยคแรกไม่เห็นด้วยกับประโยคที่สอง โดยทั่วไปคุณไม่สามารถทำ FP โดยไม่มีการรวบรวมขยะ
dsimcha

ไม่มีข้อกำหนดว่าระบบรันไทม์ของภาษาขาดการจัดการหน่วยความจำแบบโปร่งใส (มีการรวบรวมขยะ) เพื่อให้พอดีกับป้ายกำกับ "ขั้นตอนการทำงาน" ดังนั้นคุณควรพูดประโยคที่สองของคุณแบบนั้น ภาษาเบสิกเป็นภาษาหนึ่ง
Huperniketes

"โดยทั่วไปคุณไม่สามารถทำ FP โดยไม่มีการเก็บขยะ" - ทำไม
quant_dev

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

ในทางกลับกันหากภาษาของคุณเป็นภาษาที่บริสุทธิ์อย่างแท้จริง นอกจากนี้รหัสจะง่ายต่อการทดสอบและเหตุผลเกี่ยวกับ การทำหน้าที่ได้ดีจะให้ประโยชน์มากกว่าแนวทางลูกผสม หากคุณกำลังจะมีรหัสส่วนใหญ่ของคุณจะไร้สัญชาติอยู่ดีคุณอาจไปไกลกว่านั้นและเก็บเกี่ยวผลประโยชน์เพิ่มเติม
Tikhon Jelvis

1
  1. (และที่สำคัญที่สุด) แรงงานโปรแกรมเมอร์ไม่ได้รับการฝึกฝนในภาษาหรือสไตล์เหล่านั้น
  2. ผู้สอนศาสนาที่ทำหน้าที่หลายคนออกมาเป็นหลุมหรือผลไม้เพราะวิธีที่พวกเขาพยายามขายหน้าที่ ไม่มีใครชอบรูและไม่มีใครโยนเงินหลังเค้กผลไม้ ใจคุณฉันชอบสิ่งที่มีประโยชน์และอยากจะดึงมันเข้ามา แต่ฉันรู้ว่าที่ทำงานของฉันฉันจะเป็นคนเดียวที่สามารถพัฒนาได้โดยไม่ต้องใช้เงินในการฝึกอบรม (ขายยาก) และเกือบทั้งหมด การอ้างอิงพูดคุยลงที่ผู้อ่าน

การทำงานจะเกิดขึ้นเมื่อเรามีหลายร้อยคอร์และพบกับการรับรู้ที่ล็อคไม่ได้ปรับขนาด จากนั้นข้อมูลที่ซ้อนกันจะเป็นหนทางเดียวที่จะไปสู่โปรแกรม "เหล็กขนาดใหญ่" และใช้งานได้ดี


0

FP นั้นยอดเยี่ยมในแวดวงวิชาการเพราะมันยอดเยี่ยมในการเขียนโปรแกรมสั้น ๆ ที่ดีในขณะที่ไม่สนใจประสิทธิภาพการทำงาน ไม่มีการสมคบคิดต่อต้านมันในโลกแห่งความเป็นจริง ตัวอย่างเช่นการนำบางสิ่งมาใช้ (ตัวอย่างเช่นการเรียง radix) ดูเหมือนว่าจะมีความเจ็บปวดโดยรวมใน FP โอ้และรหัสที่สร้างขึ้นคือ IMHExperience sloooooooooooooooooooooow


4
ใช่มันเป็นเรื่องจริงที่ไม่สมเหตุสมผล รหัส Haskell มักจะเทียบเท่ากับ C และ Java และเร็วกว่า Python และเพื่อน ๆ นอกจากนี้ยังเป็นเรื่องเล็กน้อยที่จะทำให้ขนานกันซึ่งอาจทำให้มีความเร็วมากขึ้น
Tikhon Jelvis

0

บางคนมีช่วงการเรียนรู้ค่อนข้างสูงชันใช้เวลานาน (โดยเฉพาะถ้าคุณมาจาก OOP คุณจะงอยปากคุณสักสองสามครั้งก่อนที่จะเปลี่ยนกระบวนทัศน์)

แม้ว่าฉันเริ่มรับฟังก์ชั่นการเขียนโปรแกรม (มาจาก Java และไป Clojure) ฉันยังพบว่ามันค่อนข้างยาก ชุมชนดูเหมือนจะไม่เขียนโค้ดที่แสดงออกเป็น Java

ดูเหมือนว่ามีการสูญเสียความหมายและความซับซ้อนที่เพิ่มขึ้นเล็กน้อย


ฉันคิดว่าคนที่ไม่มีประสบการณ์การเขียนโปรแกรมก่อนหน้านี้จะบอกว่า OOP มีช่วงการเรียนรู้ที่ชันกว่า FP เนื่องจาก FP อยู่ใกล้กับคณิตศาสตร์มากขึ้น ฉันไม่เข้าใจสิ่งที่คุณหมายถึงด้วย "ชุมชนดูเหมือนจะไม่เขียนโค้ดอย่างชัดเจนเหมือน Java" จุดของคุณคืออะไร?
Jonas

ฉันไม่เคยได้ยินภาษาที่ใช้งานได้สูญเสียความหมาย แต่ฉันก็ไม่เคยใช้ภาษาที่มีความหมายน้อยกว่า Java อย่างใดอย่างหนึ่งดังนั้นฉันอาจมีความแตกต่างของ "การแสดงออก"
ลนนาตรอน

@ Jonas - เพราะสิ่งหนึ่งที่ง่าย: ชื่อ shortcuting สำหรับฟังก์ชั่นตัวแปร ฯลฯ ... ฉันหมายความว่าทำไมไม่เพียงแค่ชื่อสิ่งที่พวกเขาหรือควรจะทำอย่างไร ทำไม "pmap"
Belun

1
@Belun: นั่นไม่มีอะไรกับการเขียนโปรแกรมใช้งานได้ คุณต้องอ้างถึงภาษาการเขียนโปรแกรมเฉพาะ แผนที่เป็นฟังก์ชั่นที่พบในหลายภาษาการเขียนโปรแกรมการทำงานและมีชื่อที่ดี pmapคุณอ้างถึงอาจเป็นตัวแปรที่คล้ายคลึงกัน
Jonas

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

0

แม้ว่าฉันจะมีประสบการณ์เล็กน้อยกับภาษาการเขียนโปรแกรมที่ใช้งานได้ (ฉันรู้ว่า Haskell และ Lisp บางอย่าง) ฉันพบว่ากระบวนทัศน์ของ FP มีพลังมากและมักจะสง่างามกว่ากระบวนทัศน์อื่น ๆ ฉันหวังว่าฉันจะมีโอกาสได้ทำงานในโครงการที่จริงจังโดยใช้ FP

พื้นที่เดียวที่ฉันสงสัยอย่างจริงจังเกี่ยวกับประสิทธิผลของ FP คือวิธีที่มันสามารถจัดการกับโครงสร้างข้อมูลที่ซับซ้อนซึ่งไม่สามารถกำหนด inductively ได้เช่นกราฟ ตัวอย่างเช่นถ้าฉันต้องใช้อัลกอริทึมที่ทำงานบนกราฟขนาดใหญ่อาจเดินผ่านกราฟและทำการเปลี่ยนแปลงในท้องถิ่นเล็ก ๆ ฉันสงสัยว่าวิธีการ FP สามารถจับคู่แนวทางที่จำเป็นซึ่งโปรแกรมได้รับอนุญาตให้ย้ายจากโหนดไปยัง โหนดโดยใช้ตัวชี้

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