Tôi đang gặp phải các vấn đề trong cuốn sách Haskell O'Reilly. Vấn đề tôi đang làm việc làBắt đầu Haskell - nhận lỗi "không nằm trong phạm vi: người tạo dữ liệu"
Using the binary tree type that we defined earlier in this chapter,
write a function that will determine the height of the tree. The height
is the largest number of hops from the root to an Empty. For example, the
tree Empty has height zero; Node "x" Empty Empty has height one;
Node "x" Empty (Node "y" Empty Empty) has height two; and so on.
Tôi đang viết mã của mình trong tệp có tên là ch3.hs. Đây là mã của tôi:
36 data Tree a = Node a (Tree a) (Tree a)
37 | Empty
38 deriving (Show)
39
40 --problem 9:Determine the height of a tree
41 height :: Tree -> Int
42 height (Tree node left right) = if (left == Empty && right == Empty) then 0 else max (height left) (height right)
mở ghci trong thiết bị đầu cuối và nhập: tải ch3.hs. Khi tôi làm điều đó tôi nhận được lỗi sau:
Prelude> :load ch3.hs
[1 of 1] Compiling Main (ch3.hs, interpreted)
ch3.hs:42:7: Not in scope: data constructor `Tree'
Failed, modules loaded: none.
Tôi mong rằng trình tạo dữ liệu Tree sẽ ở đó, vì tôi đã xác định nó trong các dòng phía trên phương pháp chiều cao. Nhưng khi tôi cố tải tệp, tôi được thông báo rằng trình tạo dữ liệu không nằm trong phạm vi. Tôi đánh giá cao sự giúp đỡ của bạn và giải thích lý do tại sao lỗi này xảy ra. Cảm ơn, Kevin
Cảm ơn, điều đó đã hiệu quả. Tôi vẫn không hoàn toàn hiểu những gì đang xảy ra, và bây giờ nhận được lỗi trong thời gian chạy, nhưng sẽ tiếp tục nhìn chằm chằm và suy nghĩ và gỡ lỗi. –
Ví dụ khác có thể giúp dễ hiểu hơn. Giả sử chúng ta đang làm việc với các số nguyên chứ không phải cây cối. Int là tên của kiểu số nguyên. Bạn không thể thêm "Int + Int" bởi vì Int là tên của loại, không phải là một hàm tạo trả về một giá trị của kiểu đó. Những thứ như 0, 1, 2, ... là các nhà xây dựng, và nếu bạn muốn làm việc với các số nguyên, đó là cách bạn đưa chúng vào chương trình của bạn. Áp dụng điều này cho trường hợp của bạn, 'Tree' là tên của kiểu, và' Node' (hoặc 'Empty') là cách bạn nhận được một giá trị * của * kiểu đó. – jrockway
HaskellWiki cũng có một phần hữu ích và thậm chí còn sử dụng Tree làm ví dụ: http://www.haskell.org/haskellwiki/Constructor – jrockway