Рассмотрим следующее определение дерева:Список Карта Над Tree
data Tree a = Leaf a | Node [Tree a]
и дерево пример:
input :: Tree String
input = Node [Leaf "a", Leaf "b", Node [Leaf "c", Leaf "d"]]
Я пытаюсь 'карта' список по такому дереву, тогда как значения дерева должны быть отброшены. В случае [0..]
быть в списке, результат должен выглядеть следующим образом:
output :: Tree Int
output = Node [Leaf 0, Leaf 1, Node [Leaf 2, Leaf 3]]
Так что я ищу функцию ..
seqTree :: [b] -> Tree a -> Tree b
seqTree = undefined
.. для которых справедливо следующее:
seqTree [0..] input == output
Я пришел к выводу, что такая функция должна обернуть другую функцию, чтобы отслеживать элементы списка, которые еще не были «приняты»:
seqTree' :: [b] -> Tree a -> Tree ([b], b)
seqTree' [email protected](x:xs) t = case t of
Leaf _ -> Leaf (xs, x)
--Node ts = the tricky part... maybe something with foldr?
seqTree' [] t = error "empty list."
С этим я надеялся осуществить seqTree
, что потребует некоторое окончательное отображение по всему дереву, я предполагаю, что есть лучшие способы сделать это, вот подробная версия:
finish :: Tree (a,b) -> Tree b
finish t = case t of
Leaf v -> Leaf $ snd v
Node ts -> Node (map finish ts)
И наконец:
seqTree xs t = finish $ seqTree' xs t
компилируется, однако, как отмечается в комментарии, функция seqTree'
является частичным. Кто-нибудь знает, как это исправить, и, кроме того, что было бы более подходящим, менее низким уровнем подхода для решения этого?
Я закрыл этот вопрос как дубликат, потому что это пример более общей концепции, о которой связан связанный вопрос. Если вы считаете, что этот вопрос достаточно разный, чтобы гарантировать отдельный вопрос, тогда дайте мне знать, я буду очень рад снова его открыть :) –