Recursion 计算F#中置换的递归函数存在类型不匹配错误

Recursion 计算F#中置换的递归函数存在类型不匹配错误,recursion,f#,functional-programming,permutation,Recursion,F#,Functional Programming,Permutation,我试图用F#编写一个通用函数,它将返回列表的所有排列。我试图使用一种受java版本启发的递归算法来实现这一点 但是在递归函数的最后一行,我得到了注释中给出的错误。我猜这与整理递归循环退出时生成的输出有关(if(Array.length)的输出if) Array.map(乐趣c->SliceAtMarkerElement c)|> //下一行给出了错误 //类型不匹配。应为“a”,但给定“a[],当统一“a”和“a[]时,结果类型将是无限的 Array.map(fund->innerLoop(fs

我试图用F#编写一个通用函数,它将返回列表的所有排列。我试图使用一种受java版本启发的递归算法来实现这一点

但是在递归函数的最后一行,我得到了注释中给出的错误。我猜这与整理递归循环退出时生成的输出有关(if(Array.length)的输出
if)
Array.map(乐趣c->SliceAtMarkerElement c)|>
//下一行给出了错误
//类型不匹配。应为“a”,但给定“a[],当统一“a”和“a[]时,结果类型将是无限的
Array.map(fund->innerLoop(fstd)(snd))
innerLoop Array.empty(List.toArray inputList)

假设函数的缩进是正确的,错误消息是非常有用的。在
内循环
函数中,
Array.append firstPart secondPart
应该返回
'b[]
。但是,最后一行
Array.map(fun d->innerLoop(fst d)(snd))
强制它返回
'b[]
,无法与
'b[]
统一

我想您应该计算每个
内部循环中的排列
,然后连接这些结果。您必须使用
数组。收集
而不是
数组。映射

[|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 *)
        |]

是的。Collect很有效。但是它将所有元素都展平为一个元素数组。我想要的是一个数组数组,其中每个数组都是元素的排列。为此,我需要更改递归退出条件以返回[| array.Append firstPart SecondPart |].我已经用一些索引绑定的修复程序更新了这个问题。
[| for i in 0 .. (Array.length secondPart)-1 do
          let first, second = SliceAtMarkerElement i
          yield innerLoop first second (* returning each array as a permutation *)
        |]