F# - >折叠2个参数

时间:2011-03-31 15:03:54

标签: f# functional-programming fold

我正在尝试制作一个经过我的序列的自定义折叠,并花费2 Teams次并将它们分配给Match,然后最后返回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

但显然那不会起作用......我做错了什么? - >我知道我可以创建一个特殊的recrusive函数,但是我想让它尽可能抽象以便重用。

1 个答案:

答案 0 :(得分: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)]