data Nested a = Value a | List [Nested a] deriving (Eq, Show) nested :: Nested Int nested = List [nestedTwo, Value 1] nestedTwo = List [nested, Value 2] (!) :: Nested a -> Int -> Nested a (!) (Value _) _ = undefined (!) (List xs) n = xs !! n main = do print $ nestedTwo ! 1; print $ nestedTwo ! 0 ! 1; print $ nestedTwo ! 0 ! 0 ! 1;