对于函数参数,未定义名称空间或模块“XXXXX”

时间:2017-04-24 09:46:49

标签: 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]
        -> 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)

但是,Visual Studio引发了错误:

The namespace or module 'chunkA' is not defined.

这很令人困惑,因为'chunkA'已在函数参数中声明。

另外,我对F#和一般的函数式编程都很陌生。如果我的代码中的结构或方法不符合标准,那么请随时对此进行评论。

另外,如果我很厚,请随时告诉我。

非常感谢,卢克

2 个答案:

答案 0 :(得分:3)

正如约翰所提到的,你不能直接将数值与另一个变量进行模式匹配。模式语言只允许常量,构造函数和其他一些东西。

您可以使用when编写代码,但之后您无法以任何方式从match构造中受益,因为您只有when条款中的条件。在那种情况下,我会选择普通的if,因为它使你的工作更加明显:

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)

如果你在更多功能的数据结构上进行模式匹配,那么match构造非常有用 - 例如,如果你在两个列表(而不是数组)上编写merge,那么它会很多更好的模式匹配。

答案 1 :(得分:2)

使用match时,需要使用编译时常量。

这样的东西就是你想要的东西

|aa,_ when aa=chunkA.Length -> ....