昨天寫了一些代碼時,我遇到了兩個奇怪的問題,這兩個問題都不是我和我的功能性編程導向的朋友都知道的。我們看着它在相當一段時間,並研究它在網絡上,但我們沒能在別處找到任何答案,所以這裏有雲: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