昨天写一些代码的时候,我遇到了两个奇怪的问题,我和我的函数式编程朋友都搞不明白。我们看了很长时间,在网上研究了它,但我们无法在任何地方找到任何答案,所以这里是:
问题是在这段代码中:
第一个奇怪的问题:
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 毕竟在函数签名中。此外,let bsLength = bs.Length
在match
. 但是通过这样做,我看到了一个新的奇怪之处:
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
,警告就会消失。