2010-05-25 49 views
18

Tôi chỉ học Haskell thôi. Tôi nghĩ điều này sẽ tạo ra một chức năng thừa ...Vòng lặp vô hạn trong haskell? (newbie)

(trong vòng ghci)

Prelude> let ft 0 = 1 
Prelude> let ft n = n * ft (n - 1) 
Prelude> ft 5 

(bị treo vô thời hạn, cho đến^C).

Ai đó có thể chỉ cho tôi đúng hướng không?

Cảm ơn!

Trả lời

29

Hai câu lệnh riêng biệt let được giải thích độc lập với nhau. Đầu tiên một hàm ft 0 = 1 được xác định, và sau đó một hàm mới ft n = n * ft (n - 1) được định nghĩa, ghi đè định nghĩa đầu tiên.

Để xác định một hàm với hai trường hợp, bạn phải đặt cả hai trường hợp vào một câu lệnh let duy nhất. Để làm điều này trong một dòng duy nhất tại GHCI nhắc bạn có thể tách hai trường hợp bằng ;:

Prelude> let ft 0 = 1; ft n = n * ft (n - 1) 
Prelude> ft 5 
120 
+8

Nói cách khác, những gì bạn đã viết là (hầu như) đúng Haskell; vấn đề là GHCI chấp nhận cú pháp khác với cú pháp bạn đưa vào một tệp nguồn riêng biệt. Nếu bạn đặt hai dòng đó, nhưng không có từ 'let' (đó là" gần như "), trong tệp Factorial.hs, thì trong GHCI, hãy nhập: ': load Factorial' sau đó 'ft 5' bạn sẽ nhận được 120. Không biết nếu bạn đã đi qua "ký hiệu" chưa (ví dụ cho I/O), nhưng cú pháp được cho phép tại dấu nhắc GHCI là giống như những gì được cho phép bên trong một làm khối. –

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