data Tree a = Tree a [Tree a]
Lưu ý rằng chúng tôi không cho phép cây trống và lá là cây có danh sách phụ đề trống.hoạt động gập haskell trên cây
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
Với thông tin trên, tôi không hiểu tại sao cây chức năng gấp trả về kết quả một cách đệ quy bằng cách áp dụng các hoạt động gấp đến subtrees, sau đó áp dụng các chức năng để nhãn ở thư mục gốc và kết quả trở về từ các subtrees.
Tôi cũng không nhận được hàm cây gấp chỉ nhận một đối số thay vì 2, khi nó được chuyển làm đối số cho hàm bản đồ và nó vẫn biên dịch và chạy đúng. Ví dụ: chức năng kích thước cây bên dưới, đếm các nút của cây.
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
Vì vậy, chạy TreeSize cây nơi tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]
cho kích thước của cây như 4.
Trong chức năng kích thước cây ở trên, chức năng cây lần cũng được thông qua một đối số thay vì hai. Ngoài ra, x được chuyển đến chức năng gấp cây không được sử dụng ở bất cứ đâu, vậy tại sao bạn cần nó ở đó. Loại bỏ nó làm cho chương trình không biên dịch và nó cung cấp thông báo lỗi sau.
Couldn't match type `a' with `[[Int] -> Int]'
`a' is a rigid type variable bound by
the type signature for treeSize :: Tree a -> Int
at treeFold.hs:15:1
In the first argument of `sum', namely `ys'
In the second argument of `(+)', namely `sum ys'
In the expression: 1 + sum ys
Mọi trợ giúp sẽ được đánh giá cao.
[Tại sao lập trình chức năng lại quan trọng] (http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf). –