0

List.fold_left を使用して OCaml 関数を取得する pipe に指定されたスケルトンを埋めます val pipe : ('a -> 'a) list -> ('a -> 'a) (関数はpipe [f1;...;fn]どこにf1,...,fnありますか!) が、f任意の に対して結果xを返すような関数を返します。f xfn(...(f2(f1 x)))

ここでも、折り畳み関数fと基本ケースに適切な値を入力する必要があります。関数を実装すると、OCaml プロンプトで次のような動作が得られるはずです。

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

入力する必要があるコードは次のとおりです。

let pipe fs =
  let f a x = failwith "to be implemented" in
  let base = failwith "to be implemented" in
    List.fold_left f base fs

誰かがこれで私を助けることができますか?

4

2 に答える 2

2

指定したスケルトンでは、pipe引数を 1 つだけ取ります。pipe() の型から、この引数には typeがあり、 type の値を返すことになっていることが('a -> 'a) list -> 'a listわかります。('a -> 'a) list('a -> 'a)

の型List.fold_leftは の形式になり('b -> 'c -> 'b) -> 'b -> 'c list -> 'bました。しかし、あなたはそれを知っています:

  1. type の値を返す必要がある'a -> 'aため、ここ'bでインスタンス化されます('a -> 'a)

  2. 3 番目の引数の型('a -> 'a) listは であるため、ここに配置'c list('a -> 'a) listれます。再び'cでインスタンス化され('a -> 'a)ます。

特殊なタイプで使用すると結論付けることができますList.fold_left(はい、一口です)。

(('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)) -> ('a -> 'a) -> ('a -> 'a) list -> ('a -> 'a)

簡単に言うと、パイプが関数を返さなければならず、関数のリストを取る場合、それbase自体が関数であるf必要があり、2 つの関数を取り、関数を返さなければなりません。

どの関数にする必要baseがありますか? が空のリストのbase場合は が返されるため、 に期待される動作が必要です。fsbasepipe []

両方のタイプのとの 2 つの関数をどのようf a xに組み合わせて、単一の関数を返す必要がありますか? ここで答えを出させてもらいます。しかし、次の等式を保持したいという直感は次のとおりです。ax'a -> 'a'a -> 'a

f (パイプ [f1; f2]) f3 = パイプ [f1; f2; f3]

(これは だけでなく、どのリストにも当てはまります[f1; f2]が、この例で十分です)。と の意味の関係を理解するpipe [f1; f2]pipe [f1; f2; f3]、結合関数 を定義できるようになりますf

次の別のスケルトンから始めて、非常にpipe異なる方法で関数を記述できたことに注意してください。

let pipe fs x =
  let f a x = failwith "to be implemented" in
  let base = failwith "to be implemented" in
    List.fold_left f base fs

この場合、は typeとpipetype の 2 つの引数を取り、返される値全体は型(関数ではなく値) である必要があります。は関数 ( ) と値 ( ) を受け取り、値を返します。これは単なる値です (どちらを選択できますか?)。('a -> 'a) list'a'af'a -> 'a'abase

この 2 番目のアプローチは少し抽象度が低いので少し簡単だと思いますが、教師が最初のスケルトンを使用するように頼んだ場合、関数の操作と、関数を構築する関数の構築について教えてくれるからでしょう。

于 2012-10-26T08:59:28.137 に答える
0

最初にこれらの質問に答えたいと思うかもしれません:

  • 基本ケースのみが使用されるパイプへの呼び出しの例を書きます。
  • ベースケースはいつ使用されますか?
  • ベースケースの種類は?
  • faおよびのより適切な名前は何でしょうxか。つまり、これらの変数の役割は何ですか?
于 2012-10-26T08:54:58.777 に答える