次のプログラムで単純なハッシュ ツリー構造を作成しています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 は文字列のリストを取得し、最初に見つけたパスをフル パスに到達するか失敗するまでたどることを意図しています (これは自然ではないことは承知しています)。ツリーの動作ですが、それは私のチュートリアルが望んでいるものです)。
2 つの質問があります。1)データ宣言にあるにもかかわらず、(ターミナルのエラー メッセージ) があるのに (a /= a
最終行から) 許可されていないというエラー メッセージが表示されるのはなぜですか?No instance for (Eq a)
(Eq a)
2)私が得ているエラーとルックアップ関数の一見奇妙な動作以外に、これは良いHaskellですか、それとも慣用的なHaskellですか?
ありがとう