Мы реализуем Tries в Haskell с помощью IntMaps. Однако я не могу понять IntMaps.
Вот что у меня есть:
charMapLookup :: Char -> IntMap a -> Maybe a
charMapLookup c dict = IntMap.lookup (ord c) dict
charMapInsert :: Char -> a -> IntMap a -> IntMap a
charMapInsert c v dict = IntMap.insert (ord c) v dict
-- Question 1.
data Trie a = TrieOf (Maybe a) (IntMap (Trie a))
deriving Show
trieLookup :: [Char] -> Trie a -> Maybe a
-- My code
trieLookup [] (TrieOf a t) = a
trieLookup (x:xs) (TrieOf _ t) = trieLookup xs (charMapLookup x t)
trieInsert :: [Char] -> a -> Trie a -> Trie a
trieInsert [] a (TrieOf c t)= TrieOf c t
trieInsert (x:xs) a (TrieOf c t) | isNothing (charMapLookup x t) = trieInsert xs a (charMapInsert x Nothing t)
| trieInsert xs a (charMapLookup x t)
Мне кажется, это имеет смысл, поскольку, если в строке ничего не осталось, вы возвращаете значение узла, иначе ищите конец строки в соответствующем поддереве и аналогично для вставки. Однако, когда я пытаюсь запустить его :
Couldn't match expected type ‘Trie a’
with actual type ‘Maybe (Trie a)’
Relevant bindings include
t :: IntMap (Trie a)
trieLookup :: [Char] -> Trie a -> Maybe a
In the second argument of ‘trieLookup’, namely
‘(charMapLookup x t)’
In the expression: trieLookup xs (charMapLookup x t)
Failed, modules loaded: none.
Couldn't match expected type ‘Trie a’
with actual type ‘IntMap (Maybe a0)’
Relevant bindings include
t :: IntMap (Trie a)
c :: Maybe a
a :: a
trieInsert :: [Char] -> a -> Trie a -> Trie a
In the third argument of ‘trieInsert’, namely
‘(charMapInsert x Nothing t)’
In the expression: trieInsert xs a (charMapInsert x Nothing t)
Couldn't match type ‘Trie a’ with ‘Maybe a0’
Expected type: IntMap (Maybe a0)
Actual type: IntMap (Trie a)
Relevant bindings include
t :: IntMap (Trie a)
c :: Maybe a
a :: a
trieInsert :: [Char] -> a -> Trie a -> Trie a
In the third argument of ‘charMapInsert’, namely ‘t’
In the third argument of ‘trieInsert’, namely
‘(charMapInsert x Nothing t)’
Я не уверен, как исправить ошибку, я знаю, что это говорит о несоответствии типов, но t
должен быть IntMap of Tries (правильно?), поэтому я не знаю, как еще подойти к этому. Я потратил смущающе много времени, пытаясь понять это, любой код, который мог бы решить проблему, был бы очень признателен. Спасибо!
charMapLookup
возвращаетMaybe
, но вы передаете его как второй аргументtrieLookup
, который объявлен какTrie
.Maybe /= Trie
, поэтому несоответствие типов. То же самое с двумя другими ошибками. - person Fyodor Soikin   schedule 13.02.2018