2014-06-21 45 views
1

我是F#的新手,我一直在討論C#開發人員的前幾章F#。我被困在這一點,我需要幫助。如果有人認爲我違背了本網站的目的,請告訴我我將刪除我的問題。通過從F#中的另一箇中選擇創建一個列表#

我有以下列表

let list1 = [0..100] 

我想創建從列表中列表上方,但僅選擇整除5.我想下面的數字。

let list2 = [for i in list1 do yield if i%5=0 then i] 

但上述給我編譯錯誤如下。這是爲什麼 ?爲什麼它不能簡單地推斷int類型?

Program.fs(6,52):錯誤FS0001:預計這種表達有 型 單元,但這裏有類型 INT

回答

4

你需要移動yieldif內:

let list2 = [for i in list1 do if i%5=0 then yield i] 

一個if ... then表達沒有else只能返回類型的東西,因爲整個表達式必須有一個值,如果條件不滿足,編譯器將不會構成任何其他類型的值。

在你的情況下,你試圖說如果條件滿足,表達式應該產生一個int,否則就不會產生任何結果;正確的方法是使yield有條件。否則,你說你總是想產生一個價值,即使條件不滿意。

4

既然要篩選,它更容易,只需使用內置filter功能:

let list2 = list1 |> List.filter (fun x -> x % 5 = 0) 

鑑於你list1,它產生的輸出

[0; 5; 10; 15; 20; 25; 30; 35; 40; 45; 50; 55; 60; 65; 70; 75; 80; 85; 90; 95; 100]

+1

+1,內置列表功能非常強大,它們涵蓋了一切。 – Jwosty

+1

[此鏈接](http://msdn.microsoft.com/en-us/library/hh967652.aspx)也可能有所幫助。有完整的F#集合函數列表及其描述。 –

相關問題