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つの値、h
とt
をとります。関数fn
をhに適用し、この新しい値を持つ新しいリストをt
の前面に返します。
タイピングの観点から、値h
はfn
に渡す適切なタイプでなければならない、と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
だから、本当に、ラムダ関数の特別な種類ではありません。他の機能とまったく同じです。それは単なる表記の選択です。
あなたはどのように楽しいa b - > a bを解釈しますか? and fun h t - > fn h :: t) – patzi
私は私の答えを更新します、コメントの余地はありません。 –
私は理解していると思います。 ocamlのラムダ式は、他の関数の特定の振る舞いを表す関数です。 – patzi