2014-09-03 15 views
6

Tôi chỉ mới bắt đầu học lập trình chức năng, Lựa chọn của tôi là haskell. Đó là ok cho một vài ngày cho đến khi một cái gì đó bizzare xảy ra trong giao diện điều khiểnHaskell phun ra số sai một cách ngẫu nhiên

Lúc đầu, tôi nghĩ rằng các hướng dẫn (http://learnyouahaskell.com/starting-out) là sai

Prelude> [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 
[(1,1,1)] 

Nó phải là (3,4,5)(4,6,8). Tôi đã thử 3^2+5^2, nó phun ra số lượng lớn các số này (giống như 60 hàng số, khoảng 3000 chữ số); 4^2+3^2 dường như sản xuất cùng một số.

Đang cố gắng để thêm bất kỳ số kết quả sẽ là 100

Prelude> 100 + 200 
100 
Prelude> 300 + 500 
100 

Tôi đóng cửa sổ và mở lại nó và vấn đề được giải quyết.

Tính toán sai lầm này thường xảy ra trong Haskell không? hoặc có lẽ phiên bản Haskell của tôi bị hỏng khi tải xuống? hoặc Bất kỳ cơ hội này là một lỗi hiếm?

+6

Bạn có chắc bạn không làm điều gì đó như 'cho một + b = 100' trước khi chạy dòng đó? Tôi không thể nhân rộng kết quả của bạn, và 'cho' định nghĩa trong ghci là kinda stateful. – BluePeppers

+0

Ngoài ra, đầu ra chính xác có thể là '[(3,4,5), (6,8,10)]', đó là những gì tôi nhận được (và phù hợp với cả trang Wikipedia và toán học của tôi như là 2 đầu tiên Pythagorean triples) – BluePeppers

+0

@BluePeppers Tôi nghĩ bạn đã có nó, bởi vì sau khi "let a + b = 100', danh sách đó hiểu * làm * cho' [(1,1,1)] '. –

Trả lời

11

Điều gì đang xảy ra, như @BluePeppers đề xuất, là bạn đã thực hiện tương đương với let a+b = 100 trong ghci, sau đó sử dụng định nghĩa đó thay vì thông thường + trong tất cả các biểu thức của bạn. Bạn có thể vẫn băn khoăn tại sao lại mang lại những con số khổng lồ như vậy, và cho đến khi tôi nhận ra điểm thứ hai: Xác định lại sốcũng xác định lại ưu tiên ưu tiên, mặc định là 9 (cao nhất). Vì vậy, ví dụ của bạn trở nên hiểu là:

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 

trở thành

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^100^2 == c^2] 

3^2+5^2 

trở thành

3^100^2 
+0

Ồ, điều đó thậm chí còn tốt hơn tôi mong đợi. Làm thế nào đáng yêu – BluePeppers

+0

aah, tôi không biết haskell có thể ghi đè lên một nhà điều hành. – Rmxhaha

+0

Tôi nghĩ rằng haskell có thể giải quyết vấn đề aljebra sau đó tôi đã thử rằng trước khi thử hướng dẫn, – Rmxhaha

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