作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个带有签名seq<#seq<'a>> ->seq<seq<'a>>
的函数,该函数的行为类似于Zip方法,它接收任意数量的输入序列的序列(而不是Zip2和Zip3中的2或3),并返回序列序列而不是元组。
也就是说,给定以下输入:
[[1;2;3];
[4;5;6];
[7;8;9]]
int list list
作为输入)获得签名的好方法。
let private Tail seq = Seq.skip 1 seq
let private HasLengthNoMoreThan n = Seq.skip n >> Seq.isEmpty
let rec ZipN_core = function
| seqs when seqs |> Seq.isEmpty -> Seq.empty
| seqs when seqs |> Seq.exists Seq.isEmpty -> Seq.empty
| seqs ->
let head = seqs |> Seq.map Seq.head
let tail = seqs |> Seq.map Tail |> ZipN_core
Seq.append (Seq.singleton head) tail
// Required to change the signature of the parameter from seq<seq<'a> to seq<#seq<'a>>
let ZipN seqs = seqs |> Seq.map (fun x -> x |> Seq.map (fun y -> y)) |> ZipN_core
最佳答案
let zipn items = items |> Matrix.Generic.ofSeq |> Matrix.Generic.transpose
let zipn items =
let rec loop items =
seq {
match items with
| [] -> ()
| _ ->
match zipOne ([], []) items with
| Some(xs, rest) ->
yield xs
yield! loop rest
| None -> ()
}
and zipOne (acc, rest) = function
| [] -> Some(List.rev acc, List.rev rest)
| []::_ -> None
| (x::xs)::ys -> zipOne (x::acc, xs::rest) ys
loop items
关于f# - 如何在F#中编写类似ZipN的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11770441/
我是一名优秀的程序员,十分优秀!