F#中的位置索引

时间:2016-11-13 17:52:37

标签: list indexing f#

给定一个列表,我想生成从第一个列表中选择的第二个元素列表。

例如:

let l1 = [1..4]
let n = [0; 2]
l1.[n]

应该返回13l1的第一个和第三个元素。 不幸的是,它返回一个错误:

error FS0001: This expression was expected to have type
int but here has type int list

现在,我想知道,确实存在一种方法来传递表示列表的参数n,或者更好的是表达式吗?

3 个答案:

答案 0 :(得分:6)

F#并不为这种索引提供语法支持。您可以要求连续切片如下所示,但它并不能涵盖您的确切情况。

let a = [|1 .. 4|]
let b = a.[0..2]
// returns [|1; 2; 3|]

你可以轻松地为此编写一个函数:

let slice<'a> (indices: int list) (arr: 'a array) = 
    [| for idx in indices do yield arr.[idx] |]

slice [0; 2] a 
// returns [| 1; 3 |]

我正在妥善处理越界访问作为练习;)

答案 1 :(得分:3)

使用indexed properties,您应该能够为您的类型定义:只需定义一个接受列表/数组的member Item with get(indexes)。但是标准列表和数组已经定义了Item,你不能同时拥有两个......

答案 2 :(得分:1)

我这样解决了:

List.map (fun index -> l1.[index]) n

对于大型列表而言效率不高,但对我有用。