を使用したいList.fold_leftのですが、それは問題ありませんが、その関数のドキュメントを読むことから始める必要があります。公式ドキュメントは非常に短いです:
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
List.fold_left f a [b1; ...; bn] is f (... (f (f a b1) b2) ...) bn.
まず、その関数のタイプです。タイプは
('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
つまり、関数fold_leftには3つの引数と1つの結果値があります。最初の引数の型は('a -> 'b -> 'a)です。2番目の引数の型は'aです。3番目の引数の型は'b listです。関数の結果値のタイプは'a。です。
さて、あなたの場合、あなたは文字列を印刷したいと思います。したがって、実際には結果値は必要ありません。副作用が必要です。ただし、OCamlでは、すべての関数に結果値が必要です。()したがって、タイプが。の空の値を使用しますunit。したがって、typeパラメータ'aはあなたの場合と等しくなりunitます。
typeパラメータ'bはstring、文字列のリストで作業する必要があるためです。
したがって、あなたの場合、関数fold_leftはタイプを持っている必要があります
(unit -> string -> unit) -> unit -> string list -> unit.
の最初の引数はfold_left、タイプがである必要がありunit->string->unitます。つまり、2つの引数を持つ関数である必要があります。最初の引数は空の値、つまり()2番目の引数は文字列です。したがって、の最初の引数fold_leftはこの種の関数でなければなりません。
fun x y -> ...
ここで、タイプとタイプであるx必要があります。は常にに等しくなるため、この引数を変数として記述する必要はありません。代わりに、単純に、またはダミーの引数を記述することもできます。(構文はと同じ機能を提供します。)unitystringx()x()_fun x -> fun y -> ...fun x y -> ...
これで、fold_leftがどのように機能するかを理解し始めることができます。これは明らかに宿題の質問なので、このタスクはあなたに任せます。