を使用したい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
必要があります。は常にに等しくなるため、この引数を変数として記述する必要はありません。代わりに、単純に、またはダミーの引数を記述することもできます。(構文はと同じ機能を提供します。)unit
y
string
x
()
x
()
_
fun x -> fun y -> ...
fun x y -> ...
これで、fold_leftがどのように機能するかを理解し始めることができます。これは明らかに宿題の質問なので、このタスクはあなたに任せます。