4

我有一个喜欢的清单[1..12],我想得到一个喜欢的东西[4..9]。不知道我怎么能做到这一点,我是 F# 的新手。我不知道是否有内置方法,但我想知道手动方式。

4

3 回答 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 回答