Определение на первый взгляд простого складного экземпляра - PullRequest
1 голос
/ 20 апреля 2009

Как будет выглядеть экземпляр Foldable для этого типа данных?

data X t = X t [X t]

Я пробовал это:

instance Foldable X where
    foldMap f (X x xs) = f x `mappend` foldMap f xs

Но получил эту ошибку:

Occurs check: cannot construct the infinite type: a = X a
When generalising the type(s) for `foldMap'
In the instance declaration for `Foldable X'

1 Ответ

6 голосов
/ 20 апреля 2009

xs представляет собой список элементов, и foldMap необходимо применять к отдельным элементам, а не к самому списку. Выполнение этого с map дает список результатов, которые можно комбинировать с mconcat:

instance Foldable X where
  foldMap f (X x xs) = f x `mappend` mconcat (map (foldMap f) xs)
...