F # все перестановки класса C # - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть класс C # MyClass.

И мне нужно было бы реализовать метод f #, возвращающий все возможные перестановки элементов в IList

Проблема в том, что MyClass содержит метод bool CheckOrder (IListПредшественники) возвращает true, если экземпляр MyClass может быть помещен в перестановку после экземпляров MyClass в параметре.В противном случае этот метод возвращает false.

Пожалуйста, кто-нибудь может посоветовать мне, как реализовать правильную функцию F #.

Обновление: Пожалуйста, не могли бы вы обрисовать F # код методатест с учетом моего класса C #, имеющего метод: bool CheckOrder (предшественники IList)

1 Ответ

0 голосов
/ 11 апреля 2011

Ваш метод CheckOrder ожидает IList<MyClass>, поэтому нам, возможно, следует поработать с массивами в F #, поскольку массивы реализуют интерфейс IList.

Для каждого элемента в кандидате на перестановку нам нужнопроверьте, все ли его предшественники в массиве являются законными.Для меня это выглядит как работа для операции fold, в которой параметр состояния fold является кортежем «массива пока» и логическим флагом успеха.

let checkPermutation (permutation:MyClass[]) =
   let prefix, success =
      permutation
      |> Array.fold (fun (prefix:MyClass[], success) element ->
                        if not success then
                           (Array.empty, false) // once failed, the result is false
                        else
                           (Array.append [|element|] prefix, element.CheckOrder prefix)
                    )
                    (Array.empty, true)
   success

Array.append вероятно, совершенно неэффективно.Если это слишком медленно, вам следует рассмотреть возможность использования ResizeArray (то же самое, что C # List).

...