F # -> Fold с 2 параметрами - PullRequest
       32

F # -> Fold с 2 параметрами

2 голосов
/ 31 марта 2011

Я пытаюсь создать пользовательский фолд, который проходит через мою последовательность, занимает 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

Но, очевидно, это не сработает ... Что я делаю не так? -> Я знаю, что просто могу создать рекурсивную функцию, специально созданную для этого сценария, однако я хочу сделать ее настолько абстрактной, насколько это возможно, для повторного использования.

1 Ответ

4 голосов
/ 31 марта 2011

Я не совсем уверен, что я получаю то, что вы хотите достичь. Из последовательности [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)]
...