2009-08-01 25 views
13

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?

+1

Và một wiki cộng đồng khác ... – chaos

+0

Kiểu câu hỏi này thường được đánh giá cao hơn như một Wiki Cộng đồng. – zombat

+0

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. –

Trả lời

15

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
8

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 đó.

4

Sự khác biệt giữa [][[]]: 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.

-1

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.

+2

Đ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

+1

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

+0

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

-1

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.

+3

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

Các vấn đề liên quan