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)