我正在以下程序中编写一个简单的哈希树结构hash_lookup.hs
:
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 旨在检索给定 HashTable 的根键,lookUp 采用字符串列表,并旨在遵循它找到的第一个路径,直到它到达完整路径或失败(我知道这不是自然的树的行为,但这是我的教程想要的)。
我有两个问题:1)为什么我会收到一条错误消息,告诉我a /= a
(从最后一行)不允许No instance for (Eq a)
(终端中的错误消息),尽管(Eq a)
在数据声明中?
2)除了我得到的错误和查找函数看似奇怪的行为之外,这是好的还是惯用的Haskell?
谢谢