Function 名称空间或模块';XXXXX和x27;未为函数参数定义
在尝试重新编写合并排序程序时,我在函数中实现了一个Function 名称空间或模块';XXXXX和x27;未为函数参数定义,function,variables,parameters,f#,namespaces,Function,Variables,Parameters,F#,Namespaces,在尝试重新编写合并排序程序时,我在函数中实现了一个match with语句 let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i = match a, b with | chunkA.Length, _ -> chunkB | _, chunkB.Length -> chunkA | _ when chunkB.[b] < chunkA.[a]
match with
语句
let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i =
match a, b with
| chunkA.Length, _ -> chunkB
| _, chunkB.Length -> chunkA
| _ when chunkB.[b] < chunkA.[a]
-> array.[i] <- chunkB.[b]
merge array chunkA chunkB a (b+1) (i+1)
| _ -> array.[i] <- chunkA.[a]
merge array chunkA chunkB (a+1) b (i+1)
这是令人困惑的,因为函数参数中已经声明了'chunkA'
此外,我对F#和函数式编程总体上还是比较陌生的。如果我的代码中的结构或方法不符合标准,那么请随意对此进行评论。
另外,如果我很胖,请随时告诉我
非常感谢,Luke当您使用match时,您需要使用编译时常量 这就是你想要的
|aa,_ when aa=chunkA.Length -> ....
正如John提到的,您不能直接将一个数值与另一个变量进行模式匹配。模式语言只允许常量、构造函数和其他一些东西 您可以使用
when
编写代码,但这样您就不会从match
constrct中获得任何好处,因为在when
子句中只有条件。在这种情况下,如果,我会选择普通的,因为这会让你做的事情更加明显:
let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i =
if a = chunkA.Length then chunkB
elif b = chunkB.Length then chunkA
elif chunkB.[b] < chunkA.[a] then
array.[i] <- chunkB.[b]
merge array chunkA chunkB a (b+1) (i+1)
else
array.[i] <- chunkA.[a]
merge array chunkA chunkB (a+1) b (i+1)
让rec合并(数组:int[])(chunkA:int[])(chunkB:int[])a b i=
如果a=chunkA.Length,则chunkB
elif b=chunkB.长度然后是chunkA
elif chunkB.[b]let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i =
if a = chunkA.Length then chunkB
elif b = chunkB.Length then chunkA
elif chunkB.[b] < chunkA.[a] then
array.[i] <- chunkB.[b]
merge array chunkA chunkB a (b+1) (i+1)
else
array.[i] <- chunkA.[a]
merge array chunkA chunkB (a+1) b (i+1)