Работая над функцией, которая задала вход 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)
Спасибо за ответ. Я понимаю это, но я не понимаю, как возможен «список SuffixTree», ведь он является рекурсивным типом, а дерево суффикса может быть списком суффиксов. Я правильно понял рекурсию и как улучшить синтаксис? –
В соответствии с определением ваших данных вы можете составить список суффикс-деревьев в SuffixTree с помощью конструктора 'Node' и путем аннотации каждого из них с помощью строки' String'. Это не означает, что список SuffixTrees * является * SuffixTree. Я предполагаю, что строка 'String' должна указывать, какая ветвь должна опускаться - что бы вы ожидали аннотировать« Node xs »и« Node ys »? –
Я добавил предложение о том, как вы могли бы улучшить эту работу. –