我有一个喜欢的清单[1..12]
,我想得到一个喜欢的东西[4..9]
。不知道我怎么能做到这一点,我是 F# 的新手。我不知道是否有内置方法,但我想知道手动方式。
问问题
168 次
3 回答
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 的索引)
于 2013-08-06T13:20:45.787 回答
4
立即回答您的问题:您如何获取一份清单?模式匹配。
您可以使用模式匹配来编写一个从列表中提取范围的函数。基本算法是在 E < Min 时跳过列表的每个元素,然后在 E <= 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]
于 2013-08-06T14:42:39.357 回答
1
假设您使用F#的类似 Ocaml 的子集,您可能想要使用List标准模块,可能是它的filter
功能。
否则,可以使用带有匹配的尾递归函数。
于 2013-08-06T13:10:51.090 回答