2013-08-06 66 views
4

我有一個像[1..12]這樣的列表,我希望得到一塊像[4..9]。不知道我該怎麼做,我是F#的新手。我不知道是否有內置方法,但我想知道手動方式。如何獲得一張清單?

回答

4

要立即回答您的問題:您如何獲得一份清單?模式匹配。

您可以使用模式匹配來編寫從列表中提取範圍的函數。基本算法是跳過列表中的每個元素,同時E < Min,然後取每個元素的同時E < =最大。類似這樣的:

let range min max xs = 
    let rec skipWhile f = function 
    | x::xs when f x -> skipWhile f xs 
    | xs -> xs 
    let rec takeWhile f acc = function 
    | x::xs when f x -> takeWhile f (x::acc) xs 
    | _ -> List.rev acc 
    xs 
    |> skipWhile ((>) min) 
    |> takeWhile ((>=) max) [] 

[1..12] |> range 4 9 
> val it : int list = [4; 5; 6; 7; 8; 9] 
1

假設你使用的F# OCaml的樣子,你可能想使用List標準模塊,可能是它的filter功能。

否則,匹配的尾遞歸函數可以做到。

8
[1..12] |> List.filter (fun x -> x >= 4 && x <= 9) 

[1..12] |> Seq.skip 3 |> Seq.take 6 |> Seq.toList 

清單不支持分片,但如果你使用一個數組,而不是你也可以這樣做:

[|1..12|].[3..8] 

(注意3..8代替4..9因爲基於0的索引)