Да, Extempore или моя реализация доступна для Seq с дубликатами, например Список (1,1,1,2,2,2)

исал генератор перестановок для списков Scala, который генерирует все перестановки данного списка. До сих пор у меня есть следующее на основеэта реализация Haskell (и я думаю, что это более эффективно, чем несколько других вариантов, которые я пробовал). Есть ли способы сделать это еще более эффективным, или я охватил все свои базы?

   /** For each element x in List xss, returns (x, xss - x) */
   def selections[A](xss:List[A]):List[(A,List[A])] = xss match {
      case Nil => Nil
      case x :: xs =>
         (x, xs) :: (for( (y, ys) <- selections (xs) )
            yield (y, x :: ys))
   }

   /** Returns a list containing all permutations of the input list */
   def permute[A](xs:List[A]):List[List[A]] = xs match {
      case Nil => List(Nil)

      //special case lists of length 1 and 2 for better performance
      case t :: Nil => List(xs)
      case t :: u :: Nil => List(xs,List(u,t))

      case _ => 
         for ( (y,ys) <- selections(xs); ps <- permute(ys))
            yield y :: ps
   }

Ответы на вопрос(1)

Ваш ответ на вопрос