F# 获取数组、列表或序列的第N个元素的不同参数顺序
在获取数组、列表或Seq的第N个元素的函数中,是否有充分的理由使用不同的参数顺序:F# 获取数组、列表或序列的第N个元素的不同参数顺序,f#,pipeline,F#,Pipeline,在获取数组、列表或Seq的第N个元素的函数中,是否有充分的理由使用不同的参数顺序: Array.get source index List .nth source index Seq .nth index source 我想使用管道操作器,而且似乎只有使用Seq才有可能: s |> Seq.nth n 有没有办法用数组或列表来表示相同的符号?我想没有什么好的理由来定义数组。用这种方式获取和列表。n。考虑到管道化在F#中非常常见,它们的定义应该使源参数排在最后 在List.nth的情
Array.get source index
List .nth source index
Seq .nth index source
我想使用管道操作器,而且似乎只有使用Seq才有可能:
s |> Seq.nth n
有没有办法用数组或列表来表示相同的符号?我想没有什么好的理由来定义
数组。用这种方式获取和列表。n
。考虑到管道化在F#中非常常见,它们的定义应该使源参数排在最后
在List.nth
的情况下,变化不大,因为您可以使用Seq.nth
,时间复杂度仍然是O(n)
,其中n
是列表的长度:
[1..100] |> Seq.nth 10
在数组上使用Seq.nth
不是一个好主意,因为会丢失随机访问。要保持O(1)
数组的运行时间。获取,您可以定义:
[<RequireQualifiedAccess>]
module Array =
/// Get n-th element of an array in O(1) running time
let inline nth index source = Array.get source index
您可以直接在上述功能上使用它:
[1..100] |> flip List.nth 10
[|1..100|] |> flip Array.get 10
只需使用反向管道操作符:
[1..1000] |> List.nth <| 42
[1..1000]|>List.nth f)既然Pad和bytebuster回答了你的最后一个问题,我将集中讨论为什么部分
这是基于我目前的知识,而不是历史事实
由于F#源于OCaml,而OCaml已经和但是F#使用|>进行自然流水线,并且,F#的作者切换为Seq。但很明显,为了向后兼容OCaml,他们并没有切换所有内容。它确实起到了作用,但我不喜欢它的可读性——非常幽闭恐怖@PaulJurczak绝对是风格的问题。就我个人而言,我喜欢运算符,但它们在F#中自然有,因此在flip
、扩展方法和+1not
和defaultArg
之间进行选择,这使我习惯于使用OCaml继承理论,这很有意义。
[1..1000] |> List.nth <| 42