1

2 つの関数を組み合わせて 1 つの関数として出力する方法を見つける必要があります。

関数のリストを取り込んで、を使用して('a->'a) list関数を出力する次のコードがあります。('a->'a)List.fold_left

基本的なケースは把握しましたが、2 つの機能を組み合わせる方法はたくさん試しました。出力のタイプは('a -> 'a) list -> ('a -> 'a).

出力例:

# pipe [] 3;;
- : int = 3 
# pipe [(fun x-> 2*x);(fun x -> x + 3)] 3 ;;
- : int = 9 
# pipe [(fun x -> x + 3);(fun x-> 2*x)] 3;;
- : int = 12

関数:

let p l = 
  let f acc x = fun y-> fun x->acc   in  (* acc & x are functions 'a->'a *)
  let base =  fun x->x in
    List.fold_left f base l
4

1 に答える 1

1

左折畳みを使用する必要があることがわかっているので、今度はかなり制限された問題を解決する必要があります: type の 2 つの関数が与えられた'a -> 'a場合、それらを同じ型の 1 つの関数に結合するにはどうすればよいでしょうか?

実際には、関数を結合する一般的な方法が 1 つあります。数学では、これは通常f ∘ gwherefおよびgare 関数として記述されます。この操作は、引数を取り、gそれに適用fしてから結果に適用することに対応する新しい関数を生成します。したがって、 の場合h = f ∘ g、これを と書くこともできますh(x) = f(g(x))

したがって、関数fは実際には関数合成です。(実際には よりも適切な名前を付ける必要がありますf。) タイプの 2 つの関数を取り込んで'a -> 'a、同じタイプの別の関数を生成する必要があります。これは、2 つの引数を取る関数を生成する場合に、1 つの引数の関数を生成することを意味ます

したがって、 typeの関数compose( よりも読みやすい名前)を記述する必要があります。2 つの引数を取り、それらの両方を引数に適用する関数を生成する必要があります。f('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)fg

これにより、何をする必要があるかが明確になることを願っています。OCamlでそれを行う方法を正確に理解することは、健全な練習です。

于 2013-01-29T09:19:04.947 に答える