F#中的位置索引

Wor*_*ice 4 indexing f# list

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

例如:

let l1 = [1..4]
let n = [0; 2]
l1.[n]
Run Code Online (Sandbox Code Playgroud)

应该返回,1并且3,第一和第三个元素l1.不幸的是,它返回一个错误:

error FS0001: This expression was expected to have type
int but here has type int list
Run Code Online (Sandbox Code Playgroud)

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

scr*_*wtp 6

F#不为这种索引提供语法支持.您可以要求连续切片数组,如下所示,但它不包括您的确切方案.

let a = [|1 .. 4|]
let b = a.[0..2]
// returns [|1; 2; 3|]
Run Code Online (Sandbox Code Playgroud)

您可以轻松地为此编写函数:

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

slice [0; 2] a 
// returns [| 1; 3 |]
Run Code Online (Sandbox Code Playgroud)

我正在离开正确处理越界访问作为练习;)

  • @Worice这种类型的花式索引在特定于矩阵操作的域中的语言中很常见.正如scrwtp指出的那样,F#是一种通用语言,具有许多其他数据结构,可满足类似的需求.我记得你可以用类似的方式将索引列表传递给Deedle.然而,这仍然是[Mathnet.Numerics](http://numerics.mathdotnet.com/Matrix.html)中矩阵操作的一个很好的特性,目前解决方法是在上面的答案或[这一个](http: //stackoverflow.com/questions/40466407/how-to-shuffle-a-densematrix-in-f/40477039#40477039). (2认同)