Hãy xem xét các định nghĩa sau đây cho cây nhị phân:Thực hiện một O (log n) Foldable.elem cho cây tìm kiếm nhị phân trong Haskell
data Tree a = Nil | Node (Tree a) a (Tree a)
Các dụ Foldable
thể được định nghĩa như sau:
instance Foldable Tree where
foldr _ z Nil = z
foldr f z (Node l d r) = foldr f (f d (foldr f z l)) r
Nhưng vấn đề là chức năng elem
chạy trong O(n)
thay vì O(log n)
. Khi tôi cố gắng thực hiện một phong tục elem
:
elem x Nil = False
elem x (Node l d r)
| x == d = True
| x < d = elem x l
| otherwise = elem x r
tôi nhận được Could not deduce (Ord a) arising from a use of ‘<’
. Làm cách nào để khắc phục sự cố này?
Đối với giá trị của nó: Hàm tương ứng trong 'mono-traversable' là [' oelem'] (https://hackage.haskell.org/package/mono-traversable-1.0.5.0/docs/Data-MonoTraversable. html # v: oelem), và kể từ phiên bản 1.0.5.0, nó có triển khai hiệu quả cho 'Set'. –