提问人:Ibo 提问时间:11/19/2022 更新时间:11/19/2022 访问量:27
解决 type<seq<seq<int>> 时遇到问题?
trouble working around type<seq<seq<int>>?
问:
我用 collatz 序列定义了两个函数
初始 n 的序列
let rec collatzz n = seq {
yield n
if n%2=0 then yield! collatzz (n/2) else yield! collatzz (n*3+1)
}
let rec collatz n =
match n with
|n when n<0 -> failwith"Please use a positive integer"
|_ -> collatzz n
val collatzz: n: int -> seq<int>
val collatz: n: int -> seq<int>
以及另一个包含所有 n 个序列的序列
let collatzSequences= Seq.initInfinite (fun i -> collatz (i+1))
val collatzSequences: seq<seq<int>>
现在我正在尝试定义一个函数,该函数将告诉每个序列的停止时间(索引),或每个序列中数字 1 的第一个精度。
到目前为止,我一次可以在 1 个索引上做到这一点,但我有点卡在如何为所有序列做到这一点
collatz 1 |> Seq.findIndex (fun i -> i=1)
当然,如果我尝试
collatzSequences |> Seq.findIndex (fun i -> i=1)
它不起作用,因为它是 seq 的 seq,我不知道如何在函数中“拆分”它
答:
1赞
Fyodor Soikin
11/19/2022
#1
以某种方式转换序列的每个元素的方法称为map
当序列的每个元素都是另一个序列时,并且您想要转换它的方式是 ,您可以执行以下操作:findIndex
let findOne s = s |> Seq.findIndex (fun i -> i=1)
collatzSequences |> Seq.map findOne
或者内联,不给函数一个名字:
collatzSequences |> Seq.map (fun s -> s |> Seq.findIndex (fun i -> i=1))
评论