Как составить список всех возможных слов в дереве в haskell - PullRequest
0 голосов
/ 10 января 2020

У меня есть

t1 = Node 'a' (Node 'c' (Node 'f' Empty Empty)
 (Node 'd' Empty Empty))                     
 (Node 'b' Empty                            
 (Node 'e' Empty Empty))                    

data BTree = Empty | Node Char BTree BTree

Функция, которую мне нужно сделать: genWords :: BTree -> [String].

Это то, что я получил до сих пор:

genWords :: BTree -> [String]
genWords Empty = []
genWords (Node ch Empty Empty) = [ch]
genWords (Node ch left right) = map (ch:) (genWords left ++ genWords right)

Я знаю, что моя ошибка в том, что я беру символы, и моя функция должна возвращать список строк, но я не знаю, как это исправить.

1 Ответ

1 голос
/ 10 января 2020

ch - это Char. [ch] является String. Вы, вероятно, хотите [[ch]], который представляет собой список строк ([String]).

Более подробно, [[ch]] - это список, содержащий ровно одну строку, эта строка является [ch], которая состоит из одиночный символ ch.

genWords :: BTree -> [String]
genWords Empty = []
genWords (Node ch Empty Empty) = [[ch]]
genWords (Node ch left right) = map (ch:) (genWords left ++ genWords right)

Если вам нужны суффиксы, попробуйте вместо этого

genWords :: BTree -> [String]
genWords Empty = []
genWords (Node ch Empty Empty) = [[ch]]
genWords (Node ch left right) = map (ch:) subPaths ++ subPaths
   where subPaths = genWords left ++ genWords right
...