2012-05-17 2 views
0

У меня проблема с BST в Haskell. У меня проблема с определением «ключевой» переменной в узле (Uzel) для Ord. Но я больше ничего не понимаю.Двоичное дерево поиска в haskell, comparsion

Хотя я однажды определил аргумент «ключ» для типа дерева как Орда, он действителен, и каждое использование кода также получит эту информацию.

После кода не является полным, но есть вещь, я говорю:

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 

Лот спасибо за любую идею! !

+3

Вы не можете сравнить переменную 'k' типа' k' с переменной 'klic' типа' key'. Попробуйте 'najdi :: Ord key => key -> Значение ключа дерева -> Maybe value' как тип (и не забудьте вернуть значение когда-нибудь). – pigworker

+0

Действительно, в сообщении об ошибке говорится, что 'key' и' k' должны быть одного типа '(key ~ k)' и GHC не может это доказать. – Vitus

+1

Вопрос будет более понятным для более широкой аудитории, если вы будете использовать английские имена в своем коде. – yairchu

ответ

0

закомментируйте эту строку и он будет компилироваться:

--najdi :: (Ord key,Ord k) => k -> Tree key value -> Maybe a 
+1

Пожалуйста, объясните * почему * это то, что требуется OP делать; предоставление изменений кода без контекста или объяснения никому не помогает. – dimo414

2

Проблема заключается в том, что к и ключ должен быть того же типа, чтобы сравнить их, но вы объявляете их, возможно, будет отличаться, поэтому компилятор жалуется. Если вы сделаете их одним и тем же типом, он наберет проверку.