我試圖寫在F#列表理解並不能得到它來編譯:我可以讓let語句進入F#列表理解嗎?
[for x in xs do
let y = f(x)
when g(y) -> y]
有什麼辦法來保存列表理解中間的中間計算?我怎樣才能重寫這個列表理解,以便編譯?
我試圖寫在F#列表理解並不能得到它來編譯:我可以讓let語句進入F#列表理解嗎?
[for x in xs do
let y = f(x)
when g(y) -> y]
有什麼辦法來保存列表理解中間的中間計算?我怎樣才能重寫這個列表理解,以便編譯?
我只是略過列表理解。
let ys = xs |> List.map f |> List.filter g
但是它很簡單,足以讓你的代碼工作。
let ys = [ for x in xs do
let y = f(x)
if g(y) then yield y ]
爲了擴大對@ ChaosPandion的解決方案,你也可以這樣寫這個使用List.choose
- 把它作爲避免造成額外的列表(即,而不是與List.map
創建列表的List.map
和List.filter
組合剛將其傳遞給List.filter
)。
let ys =
xs
|> List.choose (fun x ->
let y = f x
if g y then Some y else None)
老實說,我正在看實施,我相信使用這將導致更多的對象創建。選擇實現的原因實際上是在建立列表後調用List.rev。 – ChaosPandion
@ChaosPandion您能詳細說明「更多對象創建」的含義嗎?我不明白。 – mushroom
@mushroom - 我的意思是,對於給定的輸入'Data',這個版本將創建'X'對象,而我的版本將創建'Y'對象,其中''X'大於'Y'至少'N'。我的「定理」會隨着輸入數據的長度接近零而中斷,但我們現在不可能都是專家型數學家嗎? – ChaosPandion
「列表理解」通常有[在開始和結束]。 –
順便說一句,'when'只用於模式匹配中的其他條件(更先進:用於類型約束)。我在方括號中添加了 – wmeyer
。 – mushroom