我發現自己偶爾在賦值中編寫循環(遞歸函數)。它使尷尬這樣的代碼:抽象循環
let value =
let rec loop a =
if ... then a
else loop a.B
loop a
我知道我可以移動let
外循環約束力,但它的唯一目的是計算限值。
所以我想我可能抽象循環到一個單獨的功能:
let loop f a =
let rec aux a =
match f a with
| Some b -> aux b
| None -> a
aux a
話,我可以這樣做:
let value = a |> loop (fun a -> if ... then None else Some a.B)
也許這就是更好的 - 至少它看起來更像分配比一個函數定義。這裏是我的問題:
- 是一個
let
綁定的代碼氣味的遞歸函數? - 有沒有更好的方法來重構這個?
- 如果不是,我的
loop
函數是否可以進一步推廣,或以某種方式改進?
Ha。一旦你進一步概括它,你幾乎完成了你開始的地方。 – Daniel
我很難想象編譯後的表示(.NET Reflector在F#代碼中崩潰)。儘管我能夠用ILSpy檢查它。我應該猜到它會將循環移到一個單獨的函數中,只留下一個函數調用。 – Daniel