1

指定されたリストからすべての要素を追加する関数を作成しました。

let rec add = function []->0 | h::t->h+add(t);;

今、同じ関数を書きたいのですが、を使用してList.fold_leftいますが、いくつかの変更を試みましたが、まだエラーがあります。最初にこれを試しました:

let rec add = function []->0 | h::t-> add List.fold_left((fun h t-> h+t) h t);;

しかし、エラーが発生し、List.fold_left が int 値を返すため、再帰は不要であることに気付きました。だから私は次のように変更しました:

let add = function []->0 | h::t -> List.fold_left ( fun h t-> h+t h t);;

しかし、私はまだ間違った型に関するエラーを受け取ります: しかし、私はそれを修正する方法がわかりません.誰かがこの例でError: This expression has type int -> 'a -> 'b but an expression was expected of type 'a 私の使い方を説明できますか?List.fold_left

4

3 に答える 3

11

関数を適用し、特定の方法で結果を累積することにより、関数が行うように、fold_left はリストに作用します。再帰を処理して抽象化します。リストの構造を扱うので、リストの要素を特定の方法で組み合わせる方法を扱うことができます。したがって、同じようにリストを操作する fold_left に適用する高階関数を把握する必要があります。

たとえば、リストの最大要素を取得する 2 つの方法を次に示します...

let rec max_list smallest lst = match lst with 
    | []   -> smallest
    | h::t -> max_list (max smallest h) t

let max_list smallest lst =
    List.fold_left (fun acc x -> max acc x) smallest lst

関数のいくつかの側面が似ていることに気付くでしょう。基本ケース (最小) と要素の結合方法 (関数 max を使用)。関数にも同じ類似点が見られるはずです。

最終的な実装を振り返ってみると、

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t h t)

ここでの問題は、括弧の位置が間違っていることです...

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t) h t

しかし、これは上記の例のように単純化できます。

于 2013-01-16T16:47:34.117 に答える
3

Core.Std を使用する場合、名前付きパラメーターが必要です。

List.fold_left ~f:(+) ~init:0 [1; 3; 5; 7];;
- : int = 16
于 2014-02-09T20:00:37.797 に答える