У меня проблема с 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
Лот спасибо за любую идею! !
Вы не можете сравнить переменную 'k' типа' k' с переменной 'klic' типа' key'. Попробуйте 'najdi :: Ord key => key -> Значение ключа дерева -> Maybe value' как тип (и не забудьте вернуть значение когда-нибудь). – pigworker
Действительно, в сообщении об ошибке говорится, что 'key' и' k' должны быть одного типа '(key ~ k)' и GHC не может это доказать. – Vitus
Вопрос будет более понятным для более широкой аудитории, если вы будете использовать английские имена в своем коде. – yairchu