解决 type<seq<seq<int>> 时遇到问题?

trouble working around type<seq<seq<int>>?

提问人:Ibo 提问时间:11/19/2022 更新时间:11/19/2022 访问量:27

问:

我用 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,我不知道如何在函数中“拆分”它

函数 F# 序列

评论


答:

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))