มีข้อเสียหรือปัญหาเกี่ยวกับ Haskell หรือไม่?


47

ฉันกำลังดูการดำน้ำใน Haskell สำหรับโครงการส่วนตัวของฉันต่อไป เหตุผลที่ฉันจัดการกับ Haskell คือ:

  1. ทำให้หัวของฉันเป็นภาษาที่ใช้งานได้อย่างหมดจด
  2. ความเร็ว. ในขณะที่ฉันแน่ใจว่าสิ่งนี้สามารถโต้เถียงได้ทำโปรไฟล์ว่าฉันเห็นเล็บ Haskell ใกล้กับ C ++ (และดูเหมือนว่าจะเร็วกว่า Erlang เล็กน้อย)
  3. ความเร็ว. วิปริตเว็บเซิร์ฟเวอร์น่าจะเป็นไปอย่างรวดเร็วบ้าในการเปรียบเทียบกับแทบทุกอย่างอื่น

สิ่งที่ฉันกำลังมองหาคือข้อเสียหรือปัญหาที่มาพร้อมกับ Haskell เว็บมีข้อมูลจำนวนมหาศาลเกี่ยวกับสาเหตุที่ Haskell เป็นสิ่งที่ดี แต่ฉันไม่ได้พบหัวข้อมากมายเกี่ยวกับด้านที่น่าเกลียดของมัน (นอกเหนือจากการเกี่ยวกับไวยากรณ์ที่ฉันไม่สนใจเลย)

ตัวอย่างของสิ่งที่ฉันกำลังมองหาอาจเป็น PILON ของ GIL บางสิ่งที่ไม่ได้อยู่ในหัวจนฉันเริ่มมองเห็นการใช้งานพร้อมกันในสภาพแวดล้อม CPython



26
ฉันได้ยินว่าโปรแกรมเมอร์น้อยลงได้จัดการกับปัญหาการละลายของสมอง มันเป็นเงื่อนไขที่มีราคาแพงมากในการรักษา
ChaosPandion

1
@FrustratedWithFormsDesigner: ขอบคุณสำหรับลิงค์ อย่างไรก็ตามยังไม่มีการอ้างอิงถึงข้อเสียด้านเทคนิคใด ๆ ต่อ Haskell .. อาจเป็นไปได้หรือไม่? ;)
Demian Brecht

6
@ChaosPandion: ฉันเคยได้ยินเหมือนกัน .. แต่ถ้าคุณไม่ละลายสมองคุณลองจริง ๆไหม? ;) นอกจากนี้ผมจะไม่จริงถือว่าตัวเองเป็นโปรแกรมเมอร์น้อยดังนั้นฉันไม่กังวลมากเกินไปเกี่ยวกับที่มิ)
Demian เบรชต์

3
@ChaosPandion: และแผนสุขภาพส่วนใหญ่ไม่ครอบคลุม :(
FrustratedWithFormsDesigner

คำตอบ:


48

ข้อเสียเล็ก ๆ น้อย ๆ ที่ฉันคิดได้:

  • เนื่องจากลักษณะของภาษาและรากฐานที่มั่นคงในโลกการศึกษาชุมชนจึงมีความคิดเลขเป็นอย่างมาก หากคุณเป็นคนที่จริงจังคุณอาจใช้เวลามากเกินไปและหากคุณไม่พูดภาษาอังกฤษคุณจะมีเวลายากกว่าภาษาอื่น ๆ
  • ในขณะที่มีความมั่งคั่งที่น่าทึ่งของห้องสมุดเอกสารมักจะสั้น
  • แบบฝึกหัดระดับเริ่มต้นที่อ่อนโยนนั้นหาได้ยากและหาได้ยากดังนั้นเส้นโค้งการเรียนรู้ขั้นต้นจึงค่อนข้างสูงชัน
  • ฟีเจอร์ภาษาบางอย่างนั้นไม่จำเป็นต้องเงอะงะโดยไม่จำเป็น ตัวอย่างที่โดดเด่นคือวิธีที่ไวยากรณ์ของเรคคอร์ดไม่แนะนำขอบเขตการตั้งชื่อดังนั้นจึงไม่มีวิธีที่จะมีชื่อฟิลด์เรกคอร์ดที่เหมือนกันในสองประเภทที่แตกต่างกันภายในเนมสเปซโมดูลเดียวกัน
  • Haskell ใช้ค่าเริ่มต้นในการประเมินผลที่ขี้เกียจและในขณะนี้มักจะเป็นสิ่งที่ดี แต่ก็สามารถกัดคุณได้ในบางครั้ง การใช้การประเมินแบบขี้เกียจอย่างไร้เดียงสาในสถานการณ์ที่ไม่สำคัญอาจนำไปสู่ปัญหาคอขวดของประสิทธิภาพที่ไม่จำเป็นและการทำความเข้าใจกับสิ่งที่เกิดขึ้นภายใต้ประทุนนั้นไม่ตรงไปตรงมา
  • การประเมินขี้เกียจ (โดยเฉพาะอย่างยิ่งเมื่อรวมกับความบริสุทธิ์และคอมไพเลอร์ออปติไมซ์เชิงรุก) ก็หมายความว่าคุณไม่สามารถให้เหตุผลในการสั่งการได้อย่างง่ายดาย ในความเป็นจริงคุณไม่ทราบด้วยซ้ำว่าโค้ดบางส่วนได้รับการประเมินในสถานการณ์ที่กำหนดหรือไม่ ดังนั้นการดีบักรหัส Haskell จึงต้องใช้ความคิดที่แตกต่างหากเพียงเพราะการก้าวผ่านโค้ดของคุณนั้นมีประโยชน์น้อยกว่าและมีความหมายน้อยกว่า
  • เนื่องจากความบริสุทธิ์ของ Haskell คุณไม่สามารถใช้ผลข้างเคียงเพื่อทำสิ่งต่าง ๆ เช่น I / O; คุณต้องใช้การประเมินที่ขี้เกียจของ Monad และ 'การละเมิด' เพื่อให้เกิดการโต้ตอบและคุณต้องลากบริบทของ monadic ไปรอบ ๆ ทุกที่ที่คุณต้องการทำ I / O (อันที่จริงแล้วนี่เป็นคุณสมบัติที่ดีในหลาย ๆ ด้าน แต่มันทำให้การเขียนโค้ดในทางปฏิบัติเป็นไปไม่ได้ในบางครั้ง)

16
จริงๆแล้วมีหนังสือแนะนำเบื้องต้นที่ดีบางเล่มสำหรับออนไลน์ฟรีตอนนี้ Learn You a Haskell for Great Goodเป็นหนึ่งในหนังสือเขียนโปรแกรมสำหรับผู้เริ่มต้นที่ดีที่สุดที่ฉันเคยอ่านและReal World Haskellเป็นทรัพยากรระดับกลางที่ยอดเยี่ยม
Tikhon Jelvis

1
@TikhonJelvis: นั่นเป็นเพียงสองผู้สมัครที่ฉันคิดว่าคุ้มค่าที่จะใช้ "Learn You A Haskell" สร้างความสับสนให้ฉันมากกว่าสิ่งใด "Real World Haskell" ทำงานให้ฉัน แต่ถือว่าพื้นหลังการเขียนโปรแกรมเล็กน้อย นอกจากนี้ยังมี "Gentle Introduction to Haskell" แต่ก็มีทั้งหมด แต่อ่อนโยนโดยเฉพาะอย่างยิ่งถ้าคุณไม่มีพื้นฐานด้านคณิตศาสตร์
tdammers

ฉันใช้ "Gentle Introduction to Haskell" และ "Real World Haskell" การรวมกันของทั้งสองทำให้ฉันมีข้อมูลที่เป็นประโยชน์มากมาย ฉันอยู่ในระดับที่ฉันพร้อมสำหรับโครงการที่ไม่สำคัญ แต่น่าเสียดายที่ฉันไม่มีเวลามากสำหรับมัน
Giorgio

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

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

19

ข้อเสียส่วนใหญ่ของ Haskell (เช่นเดียวกับข้อเสียส่วนใหญ่ของ Haskell) มาจากลักษณะที่กำหนดไว้สองประการ: มันขี้เกียจและทำงานได้อย่างหมดจด

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

ความเกียจคร้านยังหมายความว่าเป็นการยากที่จะสร้างมาตรฐานที่แม่นยำโดยไม่ต้องใช้ห้องสมุดเช่นเกณฑ์

การทำงานอย่างแท้จริงหมายความว่าเมื่อใดก็ตามที่คุณต้องการใช้โครงสร้างข้อมูลที่ไม่แน่นอน (ในกรณีที่ไม่สามารถทำได้ตามที่ต้องการโดยไม่ต้องใช้ - แม้ว่าจะใช้เครื่องมือเพิ่มประสิทธิภาพของ GHC ที่ไม่เกิดขึ้นบ่อยเท่าที่คุณคิด) ติดอยู่ใน IO (หรือ ST) monad ซึ่งทำให้รหัสยุ่งยากมากขึ้น

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


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

21
"และรหัส Haskell ที่ได้รับการปรับปรุงด้วยมือมักจะค่อนข้างน่าเกลียด (แม้ว่าฉันคิดว่ามันเป็นจริงในภาษาอื่น ๆ ส่วนใหญ่)" นี้. เมื่อผู้คนต้องการแสดงให้เห็นถึงความสง่างามของ Haskell พวกเขาจะเผยแพร่รหัสสั้น ๆ ที่น่ารักซึ่งน่าเสียดายที่จะให้ประสิทธิภาพที่ไม่ดีหากใช้กับข้อมูลจำนวนมาก เมื่อผู้คนต้องการแสดงให้เห็นว่า "Haskell เร็วเท่ากับ C ++" พวกเขาเผยแพร่โค้ดที่ซับซ้อนและอ่านยากซึ่งยังช้ากว่าเวอร์ชันที่อ่านได้ง่ายกว่าใน C.
quant_dev

12

ฉันไม่ใช่ผู้เชี่ยวชาญของ Haskell: ฉันได้เรียนรู้พื้นฐานแล้ว แต่น่าเสียดายที่ฉันไม่มีโอกาสทำโครงการร้ายแรงใน Haskell (ฉันต้องการเพราะฉันชอบภาษานี้มาก)

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

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

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

แก้ไข

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


บันทึกที่น่าสนใจ (และลิงก์) เกี่ยวกับการจัดการกราฟ / การสำรวจเส้นทางในโลกที่สามารถใช้งานได้อย่างแท้จริง ไม่ได้คิดว่า
Demian Brecht

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

1
บนมืออื่น ๆ ขั้นตอนวิธีกราฟสามารถฉาวโฉ่เรื่องยากที่จะแก้ปัญหาและโครงสร้างข้อมูลแบบถาวรสามารถบรรเทาปัญหานี้ ...
จอน Harrop

ฉันสงสัยว่ามันจะเป็นไปได้หรือไม่ที่จะพัฒนาชนิดข้อมูลกราฟ (ทำตามแนวคิดของ ByteString: การแสดงภายในที่มีประสิทธิภาพพร้อมฟังก์ชันการแปลง / การเข้าถึง) การใช้ monads เป็นไปได้ที่จะทำให้กราฟไม่แน่นอน แน่นอนว่าสิ่งนี้จะแก้ไขปัญหาของการแสดงกราฟ แต่ไม่ใช่ว่าจะใช้อัลกอริธึมกราฟ
Giorgio

DAG เป็นสิ่งหนึ่ง สำหรับทุกอย่างอื่นคุณสามารถใช้ประโยชน์จากความเกียจคร้านและ "ผูกปม"
danielm

4

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

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


3
ทัวริงครบถ้วนเป็นปลาเฮอริ่งแดง ทฤษฎีการคำนวณ! = การเขียนโปรแกรมเชิงปฏิบัติ

1
@delnan นั่นเป็นเหตุผลที่ฉันพูดในทางทฤษฎี
Ryathal

2
"โดเมนปัญหา" อะไรที่ Haskell ถูกกล่าวหาว่ามีประโยชน์น้อยกว่า
Andres F.

3
ในขณะที่มันเป็นความจริงชุมชนมีขนาดเล็กลงแต่มันใช้งานไม่ได้สัดส่วนจริงๆ ผมคิดว่าช่อง #haskell บนฟรีโนดเป็นเพียงที่อยู่เบื้องหลัง #python ในความนิยมภายในช่องภาษาและตอบคำถามเกี่ยวกับ Haskell ในดังนั้นจะมีการแข่งขันที่น่าแปลกใจ :)
ทิคฮอน Jelvis

@AndresF - ฉันจะไม่พูดว่า "มีประโยชน์น้อยกว่า" แต่นี่คือบางพื้นที่ที่ Haskell ยังคงแสดงวัยเด็ก: 1) DP ที่หนักหน่วง - ฉันเขียนอัลกอริธึมเครื่องหลังที่เรียบง่ายและตกใจอย่างแท้จริง ช้ามันเป็น นั่นคือการใช้อาร์เรย์ชนิดบรรจุกล่องดังนั้นฉันจึงคาดว่าจะมีค่าใช้จ่าย แต่ก็แย่กว่าที่ฉันคาดไว้มาก 2) เกมที่ไม่มีสาระสำคัญขนาดใหญ่ - AFRP อยู่ในช่วงเริ่มต้นดังนั้นจึงไม่มีกรอบที่ดีโดยเฉพาะและประสิทธิภาพยังคงยากเกินกว่าที่จะคาดเดาได้ มันจะใช้เวลานานก่อนที่เราจะเห็น Doom เวอร์ชัน Haskell (
แฟรกเมนต์

0

สิ่งที่ฉันกำลังมองหาคือข้อเสียหรือปัญหาที่มาพร้อมกับ Haskell

"problems with Haskell" มีแนวโน้มที่จะปรากฏในบางโดเมน Haskell เป็นภาษาที่ยอดเยี่ยมสำหรับการเขียนโปรแกรมแอพพลิเคชั่นซึ่งเขียนได้ดีกว่าสิ่งอื่นใด ปัญหามักเกิดขึ้นเมื่อคุณพยายามทำสิ่งที่ไม่มีการสนับสนุนที่ดีเช่น:

  • การรวบรวมข้าม GHC สามารถสร้างเป็น cross compiler ได้ แต่กระบวนการค่อนข้างเกี่ยวข้อง
  • โปรแกรมฝังตัว Haskell มีการจัดการหน่วยความจำผ่านตัวรวบรวมขยะดังนั้นอันนี้จึงไม่น่าแปลกใจเกินไป
  • ความเร็ว. Haskell นั้นไม่เร็วเท่ากับสนิม แต่ในกรณีส่วนใหญ่มันจะแข่งขันได้ค่อนข้างดี มันขึ้นอยู่กับโดเมนของแอปพลิเคชั่น - การคำนวณที่บริสุทธิ์ได้รับการปรับปรุงให้ดีที่สุด แต่บางอย่างเช่น "อ่านไฟล์ในบัฟเฟอร์และนับจำนวนบรรทัด" นั้นยากที่จะแสดงใน Haskell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.