2017-11-03 4 views
2

問題:最初の引数が単項関数で2番目の引数リストである関数mapfを定義します。結果は、引数リストの各要素に適用される関数のリストです。折り返し関数ではなくfold_rightを使用して1ライナーを記述します。fold_rightの仕組みを理解する

ソリューション:

let mapf fn list = fold_right (fun h t -> fn h :: t) list [] 

私はfold_rightは、再帰的な方法で、リストの引数を持つ関数を計算しますので、それは問題を解決する方法を理解していないので、それは価値ではなく、リストを返します。私は次の表記の意味を理解していません。

fun h t -> fn h :: t 

答えて

4

2つの質問が関連しています。 fold_rightは値を返しますが、リストは値です。

::演算子は、リストの先頭に新しい要素を追加します。したがって、fold_rightのこのアプリケーションによって計算された値は実際にリストです。

これを考えるもう1つの方法は次のとおりです。あなたは+オペレータとのfold_rightを使用している場合、あなたはそうのような値を計算する:

fold_right (+) [1; 2; 3] 0 => 
1 + 2 + 3 + 0 => 
6 

をあなたは::オペレータとのfold_rightを使用する場合は、あなたがそうのような値を計算する:

fold_right (::) [1; 2; 3] [] => 
1 :: 2 :: 3 :: [] => 
[1; 2; 3] 

これは理論的ではありません、それはREPLで、まさにこのように動作します:(あなたはトンのでfun a b -> a :: bを書くこと

# List.fold_right (+) [1; 2; 3] 0;; 
- : int = 6 
# List.fold_right (fun a b -> a :: b) [1; 2; 3] [];; 
- : int list = [1; 2; 3] 

必要彼は::表記法をスタンドアロン機能として実際に使用することはできません。残念ながら)それは自分で::演算子を使用して、リストを書くために完全に正当だと

注:

まず

# 1 :: 2 :: 3 :: [];; 
- : int list = [1; 2; 3] 

更新、fun x y -> exprはOCamlでは「ラムダ」の表記があり、すなわち、関数リテラルの場合。

fun h t -> fn h :: tは、2つの値、htをとります。関数fnをhに適用し、この新しい値を持つ新しいリストをtの前面に返します。

タイピングの観点から、値hfnに渡す適切なタイプでなければならない、とfnは、リストtにあるように、右型の値を返す必要があります。

fun h t -> (fn h) :: tのようにカッコで括弧でくくることができます。

ファンクションfun a b -> a :: bは、aをリストbに直接入れること以外は同様です。それはどんな機能も適用しません。本質的には、これはオペレータが行うことを意味します。

入力の観点から、aはリストbの要素である正しいタイプでなければなりません。

アップデート2

あなたは、ラムダが何であるかを理解しようとしている場合は、それを見ての一つの方法は、それが合理的に小さいです関数を記述するだけの手軽な方法だということです。あなたは簡単にラムダせずに特定のコードを書くことができます。

代わりにラムダの
let mapf fn list = 
    let helper h t = fn h :: t in 
    List.fold_right helper list [] 

は、このバージョンはhelperという名前のローカルに宣言された関数があります。

これを見るもう1つの方法は、すべての関数はlambdaです。関数を書くの慣用的な方法:

let f x y = x + y 

は、明示的なラムダとのバージョンのための単なる便利な略語である:

let f = fun x y -> x + y 

だから、本当に、ラムダ関数の特別な種類ではありません。他の機能とまったく同じです。それは単なる表記の選択です。

+0

あなたはどのように楽しいa b - > a bを解釈しますか? and fun h t - > fn h :: t) – patzi

+0

私は私の答えを更新します、コメントの余地はありません。 –

+0

私は理解していると思います。 ocamlのラムダ式は、他の関数の特定の振る舞いを表す関数です。 – patzi

関連する問題