f# - 获取数组、列表或序列的第 N 个元素的不同参数顺序

标签 f# pipeline

在获取数组、列表或序列的第 N 个元素的函数中使用不同的参数顺序是否有充分的理由:

Array.get source index
List .nth source index
Seq  .nth index  source

我想使用管道运算符,似乎只能使用 Seq:
s |> Seq.nth n

有没有办法与 Array 或 List 具有相同的符号?

最佳答案

我想不出有什么好的理由来定义 Array.getList.nth这样。鉴于流水线在 F# 中很常见,它们应该被定义为 source争论最后出现。

如果是 List.nth ,它没有太大变化,因为您可以使用 Seq.nth并且时间复杂度仍然是 O(n)哪里n是列表的长度:

[1..100] |> Seq.nth 10

使用 Seq.nth 不是一个好主意在数组上,因为您失去了随机访问权限。保留 O(1) Array.get的运行时间,您可以定义:
[<RequireQualifiedAccess>]
module Array =
    /// Get n-th element of an array in O(1) running time
    let inline nth index source = Array.get source index

一般来说,可以通过使用 flip 来缓解不同的参数顺序。功能:
let inline flip f x y = f y x

你可以直接在上面的函数上使用它:
[1..100] |> flip List.nth 10
[|1..100|] |> flip Array.get 10

关于f# - 获取数组、列表或序列的第 N 个元素的不同参数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15184949/

相关文章:

jenkins-plugins - 在 Jenkins 上使用构建管道插件进行参数化作业

macos - Mac 上的 Monogame 管道错误 : System. DllNotFoundException : libfreeimage. dylib

shell - 可以curl将远程url中的图像下载到缓存中,然后使用管道进行转换吗?

f# - 简单示例中的 FSCL 错误

F# - 将嵌套 for 循环转换为函数式风格

javascript - F# 到 JavaScript 编译器的 F# 项目模板

vb.net - 如何在 Process.Start 中的两个进程之间使用管道

java - 为什么在 Java 中使用管道执行系统命令会在没有空格的情况下失败?

f# - 在f#中向列表添加内容

f# - 如何为一个 fslex 规则模式返回多个标记?