昨天写了一些代码时,我遇到了两个奇怪的问题,这两个问题都不是我和我的功能性编程导向的朋友都知道的。我们看着它在相当一段时间,并研究它在网络上,但我们没能在别处找到任何答案,所以这里有云:F#奇数模式匹配问题
的问题是,在此代码:
天下第一问题:
let outer1 (bs : byte array) =
let rec inner (bs : byte array) (bacc : byte array) (i : int) =
match i with
| bs.Length -> bacc // <--- Error: bs is not recognized. Why?
| _ -> bacc.[i] <- bs.[i]
inner bs bacc (i + 1)
inner bs (Array.zeroCreate bs.Length) 0
这里的问题是:FS0039: The namespace or module 'bs' is not defined.
怎么能这样呢?毕竟,bs在函数签名中。此外,在match
之前let bsLength = bs.Length
定义一个新值。但这样做我看到一个新的怪胎:
let outer2 (bs : byte array) =
let rec inner (bs : byte array) (bacc : byte array) (i : int) =
let bsLength = bs.Length
match i with
| bsLength -> bacc
| _ -> bacc.[i] <- bs.[i] // <--- Warning: Rule never matched. Why?
inner bs bacc (i + 1)
inner bs (Array.zeroCreate bs.Length) 0
这里的问题是,上面写着警告:warning FS0026: This rule will never be matched
。 我不明白这一点。 i
和阵列的长度没有关系。如果我写一个整数(例如10
)而不是bsLength
,则警告消失。
谢谢,清除它。我现在更改了代码,并且它可以工作。此外,现在很高兴终于明白问题所在。你的好回答。 :) – oPolo