Обобщенная функция складывания для деревьев?

Как я могу написать обобщенную функцию foldr для общих деревьев Haskell?

data (Eq a, Show a) => Tree a = Void | Node a [Tree a]
    deriving (Eq, Show)

treefold :: (Eq a, Show a) => (a -> [b] -> b) ->  b -> Tree a -> b

Я застрял в определении первого аргумента...

РЕДАКТИРОВАТЬ: как насчет более обобщенной версии, избегая использования списков? Больше здесь

1 ответ

Решение
data Tree a = Void | Node a [Tree a]
    deriving (Eq, Show)

Контекст экземпляра не является обязательным; deriving будет делать правильные вещи (создание instance (Eq a) => Eq (Tree a) а также instance (Show a) => Show (Tree a)).

Ваша подпись типа выглядит просто отлично и естественно реализуема.

treefold :: (a -> [b] -> b) ->  b -> Tree a -> b
treefold _ k Void = k
treefold f k (Node a ts) = f a $ map (treefold f k) ts

См. Data.Traversable для аналогичного вдохновения.

Другие вопросы по тегам