在尝试重做合并排序程序时,我在函数中实现了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#和一般的函数式编程都很陌生。如果我的代码中的结构或方法不符合标准,那么请随时对此进行评论。
另外,如果我很厚,请随时告诉我。
非常感谢,卢克
答案 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 -> ....