Предположим, что отступ вашей функции правильный, сообщение об ошибке довольно информативно.В функции innerLoop
, Array.append firstPart secondPart
должен возвращать 'b []
.Однако последняя строка Array.map(fun d -> innerLoop (fst d) (snd d))
вынуждает его возвращать 'b [] []
, который нельзя объединить с 'b []
.
Я думаю, вы хотели бы рассчитать перестановки в каждом innerLoop
и объединить эти результаты впоследствии.Вы должны использовать Array.collect
вместо Array.map
:
[|for i in 0 .. (Array.length secondPart)-1 -> i|]
|> Array.map (fun c -> SliceAtMarkerElement c)
|> Array.collect (fun d -> innerLoop (fst d) (snd d))
В приведенном выше фрагменте используются два временных массива, что расточительно.Вы можете исключить эти дополнительные массивы, используя только выражение вычисления:
[| for i in 0 .. (Array.length secondPart)-1 do
let first, second = SliceAtMarkerElement i
yield! innerLoop first second (* concatenating results *)
|]
ОБНОВЛЕНИЕ:
Как поясняется в комментарии, вы хотите вернуть массив массивов, гдекаждый массив является перестановкой.Таким образом, ваше изменение будет работать, и map
операций должно быть:
[| for i in 0 .. (Array.length secondPart)-1 do
let first, second = SliceAtMarkerElement i
yield innerLoop first second (* returning each array as a permutation *)
|]