2012-11-25 70 views
3

我試圖寫在F#列表理解並不能得到它來編譯:我可以讓let語句進入F#列表理解嗎?

[for x in xs do 
    let y = f(x) 
    when g(y) -> y] 

有什麼辦法來保存列表理解中間的中間計算?我怎樣才能重寫這個列表理解,以便編譯?

+0

「列表理解」通常有[在開始和結束]。 –

+2

順便說一句,'when'只用於模式匹配中的其他條件(更先進:用於類型約束)。我在方括號中添加了 – wmeyer

+0

。 – mushroom

回答

9

我只是略過列表理解。

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 ] 
5

爲了擴大對@ ChaosPandion的解決方案,你也可以這樣寫這個使用List.choose - 把它作爲避免造成額外的列表(即,而不是與List.map創建列表的List.mapList.filter組合剛將其傳遞給List.filter)。

let ys = 
    xs 
    |> List.choose (fun x -> 
     let y = f x 
     if g y then Some y else None) 
+0

老實說,我正在看實施,我相信使用這將導致更多的對象創建。選擇實現的原因實際上是在建立列表後調用List.rev。 – ChaosPandion

+0

@ChaosPandion您能詳細說明「更多對象創建」的含義嗎?我不明白。 – mushroom

+0

@mushroom - 我的意思是,對於給定的輸入'Data',這個版本將創建'X'對象,而我的版本將創建'Y'對象,其中''X'大於'Y'至少'N'。我的「定理」會隨着輸入數據的長度接近零而中斷,但我們現在不可能都是專家型數學家嗎? – ChaosPandion