With Scalaz:
scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> def combine[A](xs: List[A]): List[List[A]] = { | xs.replicate[List](xs.size).sequence | } combine: [A](xs: List[A])List[List[A]] scala> combine(List('A', 'C', 'G')) res47: List[List[Char]] = List(List(A, A, A), List(A, A, C), List(A, A, G), List (A, C, A), List(A, C, C), List(A, C, G), List(A, G, A), List(A, G, C), List(A, G , G), List(C, A, A), List(C, A, C), List(C, A, G), List(C, C, A), List(C, C, C), List(C, C, G), List(C, G, A), List(C, G, C), List(C, G, G), List(G, A, A), List (G, A, C), List(G, A, G), List(G, C, A), List(G, C, C), List(G, C, G), List(G, G , A), List(G, G, C), List(G, G, G))