Ваш метод 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
).