อาร์กิวเมนต์สำหรับการเขียนโปรแกรมฟังก์ชั่น [ปิด]


10

ฉันเพิ่งเรียนรู้ F # เพื่อความสนุก (ฉันเป็น VB.NET/C# dev) และฉันชอบสิ่งที่มีให้ ในทางทฤษฎีนั่นคือ แต่ฉันมีปัญหาในการพิจารณาสถานการณ์ที่ฉันจะเลือกรหัสใน F # มากกว่าใน C # ความคิดใด ๆ


2
F#ไม่ได้เป็นตัวแทนของการเขียนโปรแกรมฟังก์ชั่นอย่างเต็มที่ ลองClojureแทน
งาน

1
ฉันไม่รู้ F # แต่ฉันใช้ Haskell เมื่อใดก็ตามที่ฉันต้องการให้ใจของฉันปลิวไป ทำงานทุกครั้งจนถึง;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickeyเป็นวิดีโอที่ยอดเยี่ยมในหัวข้อนี้ (OO vs. Functional)
mikera

ภาษาที่ใช้งานได้ดีหรือไม่? คุณสามารถมีได้มากเท่าที่คุณต้องการ : P
Erik Reppen

คำตอบ:


14

ข้อโต้แย้งเล็กน้อยสำหรับการโปรแกรมมิงแบบบริสุทธิ์:

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

สำหรับการรักษาเต็มรูปแบบให้ดูทำไมเรื่องหน้าที่ Programmingและทำไมทำไมหน้าที่ Programming เรื่องเรื่อง


6

ฉันมีปัญหาในการพิจารณาสถานการณ์ที่ฉันจะเลือกใช้รหัสใน F # มากกว่าใน C # ความคิดใด ๆ

จากที่นี่ :

เซิร์ฟเวอร์แบบอะซิงโครนัส

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

Metaprogramming (เช่นการแยกวิเคราะห์)

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

การคำนวณทางเทคนิค

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

แอปพลิเคชัน GUI

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

การเขียนโปรแกรมลอจิก

  • คอลเลกชันถาวรสำหรับการย้อนรอยง่าย
  • หางเรียกร้องให้มีความน่าเชื่อถือ
  • การวางนัยทั่วไปโดยอัตโนมัติเพื่อการโปรแกรมทั่วไปที่ง่าย

การทดสอบ

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

ประสิทธิภาพ

  • inline สำหรับสิ่งที่เป็นนามธรรมสูงกว่าคำสั่งที่เป็นนามธรรมฟรี
  • หางเรียกร้องให้เครื่องรัฐอย่างรวดเร็ว
  • โครงสร้างข้อมูลที่ใช้งานได้จริงเพื่อความหน่วงแฝงต่ำ
  • Metaprogramming สำหรับการสร้างรหัสที่ปรับให้เหมาะสม

ฉันจะยอมรับว่าฉันไม่รู้ F # หรือ C # แต่ฉันขอแนะนำให้ใช้เวลาสองสามวันใน F # และดูว่าคุณคิดอย่างไร สำหรับความคิดของฉันในการใช้ REPL ถือเป็นชัยชนะครั้งสำคัญในทุกภาษาที่สนับสนุน
Zachary K

5

นี่คือสิ่งที่ใช้การเขียนโปรแกรมสไตล์การทำงานสำหรับ - ในชีวิตประจำวันมากขึ้นหรือน้อยลง

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

การคำนวณแต่ละขั้นตอนจะเพิ่มรายละเอียดเพิ่มเติม แต่ไม่ได้ทำให้วัตถุกลายพันธุ์ ในตอนท้ายของท่อเรากำลังทำการลดแฟนซีเพื่อคำนวณจำนวนเงินและจำนวนและสิ่งอื่น ๆ

ลองนึกภาพสิ่งนี้

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

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

(เราใช้ Python ดังนั้นการเขียนโปรแกรมการทำงานโดยใช้ฟังก์ชั่นเครื่องกำเนิดไฟฟ้า)

มันง่ายกว่าที่จะใช้ไร้สัญชาติและวัตถุที่เปลี่ยนไม่ได้


Python มีค่าเทียบเท่า F # นี้หรือไม่ criteria() |> some_query |> calculate |> enrich |> summarizeฉันพบว่าผู้ดำเนินการไพพ์ไปข้างหน้าสามารถนำไปสู่รหัสที่ชัดเจนขึ้น แต่ฉันเชือนแช
ChaosPandion

@ChaosPandion: ก่อนอื่นไวยากรณ์นั้นทำให้ฉันสับสน แต่บางคนดูเหมือนจะชอบมัน มีแพ็คเกจ Python นับไม่ถ้วน ฉันแน่ใจว่าคุณสามารถค้นหาใน SO และหาคำตอบ
S.Lott

@Chaos: ไม่ใช่ที่ฉันรู้ ฉันมักจะเขียนmapเพื่อให้ได้ผลเหมือนกัน
พอลนาธาน

4

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

ลองนึกภาพการใช้คอมไพเลอร์ใน C # และ F # - แสดงถึงต้นไม้ไวยากรณ์ที่เป็นนามธรรมและแปลงมันง่ายกว่ามากหากภาษาของคุณมี ADT และการจับคู่รูปแบบ


2

เหมาะอย่างยิ่งสำหรับแผนที่ลดขนาดของระบบหลายระบบที่มีขนาดใหญ่และการขนานแบบมัลติคอร์ขนาดใหญ่ ค่อนข้างเท่ห์เมื่อพิจารณาว่าเซิร์ฟเวอร์ระดับเริ่มต้นในปัจจุบันมาพร้อมกับ 48 คอร์ (นับ 96 HT)


2

หากคุณต้องการลองใช้ Haskell อย่างเต็มประสิทธิภาพ Erlang ก็มีของดีๆให้คุณ

Simon Payton-Jones กล่าวเกี่ยวกับ Haskell เขาต้องการมีโปรแกรมที่เห็นได้ชัดว่าไม่มีข้อบกพร่องแทนที่จะไม่มีข้อบกพร่องที่ชัดเจน

(ฉันอาจได้รับใบเสนอราคาปิด แต่คุณได้รับความคิด)

ด้วยการ จำกัด ผลข้างเคียงคุณจะสามารถพิสูจน์ได้ง่ายขึ้น


1

ข้อดีอย่างหนึ่งที่ชัดเจนคือมันขนานกันได้ง่ายกว่ามาก


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