我正在尝试制作一个经过我的序列的自定义折叠,并花费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函数,但是我想让它尽可能抽象以便重用。
答案 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)]