Trong tinh thần của những sai lầm phổ biến khác trong câu hỏi, những sai lầm phổ biến nhất mà các lập trình viên của Haskell tạo ra là gì? Tôi đã tự dạy mình Haskell một thời gian ngắn và tôi bắt đầu cảm thấy đủ thoải mái với ngôn ngữ để bắt đầu áp dụng nó trong thế giới thực.Lỗi lập trình phổ biến cho các nhà phát triển Haskell để tránh?
Trả lời
Sai lầm phổ biến nhất mà tôi biết là giới thiệu một lỗ rò không gian qua đánh giá lười biếng. Có rất nhiều cách để đạt được sai lầm này, nhưng một trong đó đặc biệt là các lập trình viên móng tay với kinh nghiệm lập trình chức năng khác là đặt kết quả vào một tham số tích lũy, nghĩ rằng tham số tích lũy sẽ chiếm không gian liên tục. Trong nhiều trường hợp, tham số tích lũy lấy không gian tuyến tính vì các tham số không được đánh giá.
Một lỗi phổ biến khác là quên rằng let
luôn đệ quy. Anintentional
let x = ... x ...
có thể dẫn đến kết quả baffling.
Hầu hết các trải nghiệm xấu phổ biến khác thể hiện không phải là lỗi nhưng gặp khó khăn khi tải chương trình qua trình kiểm tra loại hoặc khó hiểu mô hình I/O đơn thuần. Những khó khăn với việc hiểu danh sách và thỉnh thoảng có các ký hiệu do
.
Nói chung những khó khăn phải đối mặt bằng cách bắt đầu lập trình Haskell bao gồm
- ngôn ngữ lớn với nhiều góc tối, đặc biệt là trong hệ thống kiểu
- chương trình Rắc rối việc để biên dịch, đặc biệt là khi họ làm I/O
- Làm mọi thứ trong đơn
IO
mono - Khó khăn lớn dự đoán hành vi thời gian và không gian của các chương trình chức năng lười biếng
Lỗi thường gặp đối với bắt đầu Người lập trình Haskell là forget the difference between constructor and type namespaces. Đó là sai lầm của một người mới bắt đầu mà tôi xấu hổ khi có tên của tôi gắn liền với nó, nhưng tôi khá tự tin rằng những người khác sẽ vấp ngã khi câu trả lời đó khi họ có một vấn đề tương tự, vì vậy cũng có thể giữ nó ra khỏi đó.
Sự khác biệt giữa []
và [[]]
: danh sách trống và danh sách có 1 phần tử, cụ thể là danh sách trống. Điều này đặc biệt bật lên trong các trường hợp cơ sở của các hàm đệ quy.
Sử dụng các hàm không đệ quy đuôi hoặc không phải các nếp gấp nghiêm ngặt xảy ra với tràn ngăn xếp.
Điều này ít đúng trong Haskell hơn các ngôn ngữ chức năng khác. Rất nhiều thời gian, sự lười biếng làm cho các phiên bản chức năng không đuôi trở thành một lựa chọn tốt hơn (ví dụ: bạn có thể "gấp nếp" một danh sách vô hạn, trong khi đó 'foldl' đuôi đệ quy sẽ phát nổ mỗi lần). – Chuck
Tôi biết điều đó, nhưng đầu (x: xs) = đầu xs + 1 sẽ không phát nổ trên danh sách 1000000 mục? – Hai
Tôi đã thử 'head '' (x: xs) = let x '= head' 'xs trong x' \' seq \ 'x '+ 1', không thành công. Có ai có manh mối nào không? – ScootyPuff
Khái niệm về biểu thức khá khó hiểu đối với người mới bắt đầu. Lấy cấu trúc có điều kiện bằng ngôn ngữ lập trình bắt buộc. Có chỉ là một cấu trúc của nó nhưng trong Haskell một biểu hiện của nó. Vì vậy, nếu một điều kiện phải có một kết hợp khác và cả hai phải mang lại giá trị của cùng một loại đánh giá.
wrongFunc n = if n > 18
then 1
else False
Khối if đánh giá đến số nguyên khi người khác trả về một bool. Đây là một lỗi phổ biến như trong Haskell họ không chỉ là khối báo cáo nhưng biểu thức.
Tôi không hiểu tại sao điều đó gây nhầm lẫn và tôi là một người mới của Haskell. So sánh cùng một thứ trong ngôn ngữ giống như C: bạn có trả về rõ ràng, nhưng kiểu trả về sẽ là int hoặc bool và nó sẽ là một lỗi trả về 1 hoặc false phụ thuộc vào giá trị của đối số. – Zak
- 1. Lập trình ứng dụng và các loại lisp phổ biến
- 2. Thành ngữ phổ biến để tránh trình duyệt IE: Lỗi: 'console' không được xác định
- 3. Trình biên dịch phổ biến cách độc lập để triển khai macro UNUSED trong C/C++
- 4. Python cho các nhà phát triển C++
- 5. Thiết lập nhà phát triển để bắt đầu với lập trình Cocoa/Mac
- 6. typography cho các nhà phát triển
- 7. Java cho các nhà phát triển C#
- 8. thiết lập git cho một nhà phát triển duy nhất?
- 9. Proxy Web dành cho nhà phát triển
- 10. Trình đọc PDF E-ink dành cho nhà phát triển?
- 11. Tham chiếu chuẩn về nội bộ JVM cho lập trình viên/nhà phát triển
- 12. Qt dành cho nhà phát triển Delphi
- 13. Tránh các biến toàn cục trong lập trình được nhúng
- 14. Lỗi phổ biến nhất được thực hiện trong phát triển WPF là gì?
- 15. Các kỹ thuật phổ biến để gỡ lỗi .htaccess
- 16. Các hệ thống nhúng/cấp thấp có khó lập trình cho các nhà phát triển phần mềm không?
- 17. Tại sao các nhà phát triển PHP rẻ hơn các nhà phát triển .NET?
- 18. Xcode khởi động nhanh cho nhà phát triển Visual Studio
- 19. Cách thiết lập môi trường phát triển tại nhà?
- 20. API Windows cho các chức năng trình phát phương tiện phổ biến?
- 21. Các vấn đề phổ biến mà các nhóm phát triển Android nhỏ gặp phải là gì?
- 22. Biệt hiệu cho các ký tự đặc biệt lập trình phổ biến là gì?
- 23. SharePoint cho Nhà phát triển C# ASP.NET
- 24. Lập trình gia hạn giấy phép nhà phát triển Windows 8 theo chương trình?
- 25. Django dành cho nhà phát triển web2py
- 26. Có nhà phát triển nào cho craigslist.org
- 27. Python hoặc Ruby dành cho nhà phát triển .NET?
- 28. Gỡ lỗi iframe bằng công cụ nhà phát triển Chrome
- 29. Cần tránh các tính năng C++ để phát triển nhúng
- 30. Đánh giá nhà phát triển
Và một wiki cộng đồng khác ... – chaos
Kiểu câu hỏi này thường được đánh giá cao hơn như một Wiki Cộng đồng. – zombat
Thật khó để tưởng tượng tại sao đây là "không phải là một câu hỏi thực sự" khi có rất nhiều câu hỏi "sai lầm lập trình phổ biến khác" trên SO đã tồn tại. –