Tôi viết một cấu trúc cây băm đơn giản trong chương trình sau hash_lookup.hs
:Haskell: Khó khăn nhúng bối cảnh (Eq a) vào tờ khai dữ liệu
module Main where
data (Eq a) => HashTable a b = HashChildren (a, [HashTable a b]) | Hash (a, b) deriving (Show)
getKey :: HashTable a b -> a
getKey (HashChildren (k, hs)) = k
getKey (Hash (k, h)) = k
lookUp :: [a] -> HashTable a b -> Maybe (HashTable a b)
lookUp [] table = return table
lookUp _ (Hash _) = Nothing
lookUp (p:path) (HashChildren (_, ts)) = lookUp path (head (dropWhile (\x -> (getKey x) /= p) ts))
getKey được thiết kế để lấy chìa khóa gốc của Hashtable được và lookUp có một danh sách các chuỗi và có nghĩa là đi theo con đường đầu tiên nó tìm thấy cho đến khi nó đạt đến đường dẫn đầy đủ hoặc không thành công (tôi biết rằng đây không phải là hành vi tự nhiên đối với một cây nhưng đó là điều mà hướng dẫn của tôi muốn).
Tôi có hai câu hỏi: 1) Tại sao tôi lại nhận được một thông báo lỗi nói với tôi rằng a /= a
(từ dòng cuối cùng) không được phép là có No instance for (Eq a)
(thông báo lỗi trong thiết bị đầu cuối), mặc dù (Eq a)
trong khai báo dữ liệu ?
2) Khác với các lỗi tôi nhận được và hành vi có vẻ kỳ lạ của các chức năng tra cứu, là này tốt hoặc ngữ Haskell?
Cảm ơn
Tính năng ngữ cảnh dữ liệu sẽ bị xóa trong phiên bản tương lai của Haskell http://www.haskell.org/pipermail/haskell/2011-January/022497.html – sdcvvc