External Publication
Visit Post

How do I implement this transformation using generics?

Haskell Community [Unofficial] May 23, 2026
Source

Let’s say I have a data type for integer lists. There are two Conses: one that takes a normal List, and one that takes a DeeperList, which just embeds a List.

data DeeperList = DeeperList List
data List = Nil
            | Cons1 Int List
            | Cons2 Int DeeperList

I’d like to write a function incr:

incr :: Int -> List -> List

such that incr k l increments each integer in l by k plus the number of DeeperLists that embeds that integer. For example:

incr 3 $ Cons1 2 $ Cons2 4 $ DeeperList $ Cons2 0 $ DeeperList $ Cons1 5 Nil
         -------------------------------------------------------------------
         --  represented more compactly as [ 2, 4, D[ 0, D[ 5 ]]]

should be:

Cons1 5 $ Cons2 7 $ DeeperList $ Cons2 4 $ DeeperList $ Cons1 10 Nil
-------------------------------------------------------------------
--  [ 5, 7, D[ 4, D[ 10 ]]]

I’d like to implement incr with generics, specifically with something like gfoldl, gmapT, etc., stuff from Data.Data. How do I do that?

Discussion in the ATmosphere

Loading comments...