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 に答える