0

Haskell の BST に問題があります。Node(Uzel) の「キー」変数を Ord に定義することに問題があると思います。でも、それ以上のことは絶対にわかりません。

ただし、ツリー型の「キー」引数を Ord として定義した場合、それは有効であり、コードで使用するたびにこの情報も取得されます。

次のコードは完全ではありませんが、私が話していることは次のとおりです。

data (Ord key) => Tree key value = List key value |Uzel (Tree key value) key value (Tree key value) | Null deriving (Show)

prazdny :: Ord key => Tree key value
prazdny = Null

najdi :: (Ord key,Ord k) => k -> Tree key value -> Maybe a
najdi k Null = Nothing
najdi k (Uzel levy klic hodnota pravy) = if k < klic
                then najdi k levy
                else najdi k pravy

コンパイルしようとすると、次のようになります。

bvs.hs:9:49:
Could not deduce (key ~ k)
from the context (Ord key, Ord k)
  bound by the type signature for
             najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a
  at bvs.hs:(8,1)-(11,58)
  `key' is a rigid type variable bound by
        the type signature for
          najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a
        at bvs.hs:8:1
  `k' is a rigid type variable bound by
      the type signature for
        najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a
      at bvs.hs:8:1
In the second argument of `(<)', namely `klic'
In the expression: k < klic
In the expression: if k < klic then najdi k levy else najdi k pravy

どんなアイデアにも感謝します!!

4

2 に答える 2

2

問題は、それらを比較するために k と key が同じ型でなければならないことですが、それらが異なる可能性があると宣言すると、コンパイラーは文句を言います。それらを同じ型にすると、型チェックが行われます。

于 2012-05-19T02:01:46.777 に答える
0

この行をコメントアウトすると、コンパイルされます。

--najdi :: (Ord key,Ord k) => k -> Tree key value -> Maybe a
于 2012-05-17T23:48:53.053 に答える