【发布时间】:2011-01-15 22:44:32
【问题描述】:
我正在寻找一种方法来创建一个由另一个序列的每个第 n 个元素组成的序列,但似乎没有找到一种优雅的方法来做到这一点。我当然可以破解一些东西,但我想知道是否有我没有看到的库函数。
名称以 -i 结尾的序列函数似乎非常适合确定元素何时是第 n 个或(n 的倍数)第一个,但我只能看到 iteri 和 @987654322 @,没有一个真正适合这项任务。
例子:
let someseq = [1;2;3;4;5;6]
let partial = Seq.magicfunction 3 someseq
那么partial 应该是[3;6]。那里有类似的东西吗?
编辑:
如果我不那么雄心勃勃并允许n 保持不变/已知,那么我刚刚发现以下应该可行:
let rec thirds lst =
match lst with
| _::_::x::t -> x::thirds t // corrected after Tomas' comment
| _ -> []
有没有办法把这个写得更短?
【问题讨论】:
-
您可以使用
mapi将列表中的每个元素转换为Some或None、filter出Nones,然后将map它们返回到又是未修饰的类型。 -
您使用列表的解决方案看起来不错(但您可能想编写
_::_::x::t(而不是使用元组列表的(_, _, x)::t)。不同之处在于Seq将与其他集合一起使用列表,但这对您来说可能不是问题。您的列表版本是一个很好的功能代码。 -
是的,当然,它必须是
_::_::x::t,应该在粘贴之前询问编译器。 -
仍然想知道对于一般情况最有效的解决方案是什么,但是对于我手头的问题,我现在正在使用模式匹配。感谢您花时间回答这个问题。
标签: f#