我怎么做F#在APL中称为压缩?

Jon*_*ats 5 f# apl

在APL中,可以使用位向量来选择另一个向量的元素; 这叫做压缩.例如,1 0 1/3 5 7将产生3 7.

在函数式编程中是否有一个可接受的术语,特别是F#?

这是我的F#程序:

let list1 = [|"Bob"; "Mary"; "Sue"|]
let list2 = [|1; 0; 1|]

[<EntryPoint>]
let main argv = 

    0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)

我想要做的是计算一个新的字符串[],它将是[|"Bob"; 苏"|]

如何在F#中做到这一点?

Sør*_*ois 6

Array.zip list1 list2                 // [|("Bob",1); ("Mary",0); ("Sue",1)|]
|> Array.filter (fun (_,x) -> x = 1)  // [|("Bob", 1); ("Sue", 1)|]
|> Array.map fst                      // [|"Bob"; "Sue"|]
Run Code Online (Sandbox Code Playgroud)

管道运算符|>在语法上反转功能应用程序,即x |> f相当于f x.如在另一种答案提到的,替换ArraySeq,以避免中间阵列的构造.

我希望你会发现F#中缺少许多APL原语.列表和序列,许多可以通过原语从串在一起来构建Seq,ArrayList模块,如上述.作为参考,这里是一个概述了的Seq模块.

  • 如果一个人是无点风格的粉丝,可以使用`snd >>(=)1`代替. (4认同)