如何获得一份清单?

时间:2013-08-06 13:06:33

标签: f#

我有一个像[1..12]这样的列表,我希望得到像[4..9]这样的内容。不知道我怎么能这样做,我是F#的新手。我不知道是否有内置方法,但我想知道手动方式。

3 个答案:

答案 0 :(得分: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的索引)

答案 1 :(得分:4)

立即回答您的问题:您如何获取一份清单?模式匹配。

您可以使用模式匹配来编写从列表中提取范围的函数。基本算法是跳过列表中的每个元素,而E&lt;最小,然后在E&lt; = Max 时获取每个元素。像这样:

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]

答案 2 :(得分:1)

假设您使用类似Ocaml的 F#子集,您可能希望使用List标准模块,可能是filter函数。

否则,带匹配的尾递归函数可以。