2014-01-02 3 views
1

Работая над функцией, которая задала вход SuffixTree, выводит список целых чисел в этом дереве суффиксов. Например. getIndices tree1 = [2,4,1,3,5,0]. Порядок списка целых чисел не имеет значения. Я получаю ошибку, на второй последней строке функции: «Couldn't match expected type 'SuffixTree' with actual type '[SuffixTree]'». Я давно об этом подумал и не повезло. Любая помощь будет принята с благодарностью.Haskell: ошибка алгебраических типов (деревья суффикса: рекурсия)

data SuffixTree = Leaf Int | Node [ (String, SuffixTree) ] 
      deriving (Eq,Ord,Show) 

text1 :: String 
text1 = "banana" 

tree1 :: SuffixTree 
tree1 = Node [("banana",Leaf 0), 
       ("a",Node [("",Leaf 5), 
         ("na",Node [("",Leaf 3), 
            ("na",Leaf 1)])]), 
       ("na",Node [("",Leaf 4), 
          ("na",Leaf 2)])] 

------------------------------------------------------------------ 

getIndices :: SuffixTree -> [ Int ] 
getIndices sufTree = getIndices' sufTree [] 
    where getIndices' :: SuffixTree -> [Int] -> [Int] 
     getIndices' (Node ((_, Node xs):ys)) c 
      | Node xs == Node [] = c 
      | otherwise = getIndices' ((Node xs):([Node ys])) c 
     getIndices' (Node ((_,Leaf i):xs)) c = getIndices' (Node xs) (i:c) 

ответ

2

Ваша getIndices' функция полезности объявляется взять SuffixTree, но в otherwise случае вы передаете его (Node xs:[Node ys]), который имеет тип [SuffixTree].

Учитывая, что все, что вам нужно сделать, это собрать до целых чисел в дереве, возможно, ваш otherwise случае просто нужно позвонить getIndices' дважды:

| otherwise = getIndices' (Node xs) (getIndices' (Node ys) c) 

Ваш код также имеет некоторые другие проблемы. Если вы скомпилируете с предупреждениями (-Wall), компилятор предупредит вас о неполных совпадениях шаблонов. Из-за этого ваш код также выходит из строя.

Незавершенность в том, что getIndices' не охватывает все возможные виды SuffixTree. Вам также необходимо заполнить случаи для getIndices' (Leaf Int) и getIndices' (Node []).

Кроме того, существующий случай для | Node xs == Node [] в Node ((_, Node xs):ys случае становится излишним: он будет обрабатываться рекурсивным вызовом getIndices' из otherwise случае, а затем нового Node [] случая. Вы также можете подумать о том, как упростить два случая, которые у вас уже есть в одном случае.

+0

Спасибо за ответ. Я понимаю это, но я не понимаю, как возможен «список SuffixTree», ведь он является рекурсивным типом, а дерево суффикса может быть списком суффиксов. Я правильно понял рекурсию и как улучшить синтаксис? –

+0

В соответствии с определением ваших данных вы можете составить список суффикс-деревьев в SuffixTree с помощью конструктора 'Node' и путем аннотации каждого из них с помощью строки' String'. Это не означает, что список SuffixTrees * является * SuffixTree. Я предполагаю, что строка 'String' должна указывать, какая ветвь должна опускаться - что бы вы ожидали аннотировать« Node xs »и« Node ys »? –

+0

Я добавил предложение о том, как вы могли бы улучшить эту работу. –

Смежные вопросы