我有一个像[1..12]
这样的列表,我希望得到像[4..9]
这样的内容。不知道我怎么能这样做,我是F#的新手。我不知道是否有内置方法,但我想知道手动方式。
答案 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
函数。
否则,带匹配的尾递归函数可以。