2

我正在尝试制作一个贯穿我的序列的自定义折叠,一次需要 2Teams次并将它们分配给 a Match,然后最后返回 a Match list

我目前的代码是:

let myFold f s =
    let rec myFold' f s acc =
        match s with
        | (a1::a2::a) -> f a1 a2::acc
        | _ -> acc
    myFold' f s []

这给了我(int -> int) list

但显然那是行不通的......我做错了什么?-> 我知道我可以为这个场景创建一个专门的递归函数,但是我想让它尽可能抽象以便重用。

4

1 回答 1

4

我不太确定我能得到你想要达到的目标。从序列 [1;2;3;4] 你想得到 [(1,2); (3,4)] 或 [(1,2); (2,3); (3,4)] ?

let fold f s = 
    let rec impl acc = function
        | x::y::rest -> impl ((f x y)::acc) rest
        | _ -> List.rev acc
    impl [] s    

let s = [1;2;3;4;5;6]    
let r = fold (fun x y -> x,y) s  // [(1, 2); (3, 4); (5, 6)]

let fold2 f s = Seq.pairwise s |> Seq.map f |> Seq.toList
let r2 = fold2 id s // [(1, 2); (2, 3); (3, 4); (4, 5); (5, 6)]
于 2011-03-31T15:08:01.667 回答