Recursion 计算F#中置换的递归函数存在类型不匹配错误
我试图用F#编写一个通用函数,它将返回列表的所有排列。我试图使用一种受java版本启发的递归算法来实现这一点 但是在递归函数的最后一行,我得到了注释中给出的错误。我猜这与整理递归循环退出时生成的输出有关(if(Array.length)的输出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
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 *)
|]