[Haskell-cafe] Deep concatenation [Was: Incorrectly inferring type [t]]

oleg at okmij.org oleg at okmij.org
Thu Dec 30 12:52:59 CET 2010

William Murphy wrote:
> I've spent a lot of time trying to write a version of concat, which
> concatenates lists of any "depth":

It is a little bit more involved, but quite possible. The code is not
much longer than the one you wrote (essentially, three lines: one
class and two instance declarations). Here is the complete code:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverlappingInstances #-}

module DeepFlat where

class DeepFlat a b | a -> b where
    dflat :: [a] -> [b]

-- If we flatten a list of lists
instance DeepFlat a b => DeepFlat [a] b where
    dflat = concatMap dflat

-- If we are given a list of non-lists
instance a ~ b => DeepFlat a b where
    dflat = id

test1 = dflat "abracadabra"
-- "abracadabra"

test2 = dflat ["abra","cadabra"]

test3 = dflat [["ab","ra"],["cad","abra"]]
test4 = dflat [[["a","b"],["ra"]],[["cad","abra"]]]

More information about the Haskell-Cafe mailing list