3

フロートのリストの平均を見つけようとしています。

let avg l =
    List.fold_left ( +. ) 0 l /. List.length l;;

List.fold_leftはどのように機能しますか?(最初の引数をリスト(3番目の引数)に適用します...しかし、2番目の引数は何ですか?)

トップレベルはこのエラーを返します:

Characters 43-44:
        List.fold_left ( +. ) 0 l /. List.length l;;
                             ^
Error: This expression has type int but is here used with type float

OCamlのリストを反復処理するための好ましい方法は何ですか?

4

2 に答える 2

8

2番目の引数は、アキュムレータの初期値です。左折りの場合は、リストの左側に視覚的に配置できます。[1;2;3;4;5]したがって、初期値が0の左折りの場合、次のようになります。

((((0 + 1) + 2) + 3) + 4) + 5

したがって、この場合、最も内側の括弧はに(0 +. 1.0)なります。これは、0がintであり、言語が自動的にfloatに変換しないため、OCamlでは機能しません。

于 2009-09-05T19:49:22.100 に答える
5

チャックが述べたように、intとfloatの間の自動変換はありません。また、浮動小数点リテラルであるためには、小数点または指数表記のいずれかである必要があります。

したがって、コードを修正するには、0に小数点を追加して浮動小数点定数にする必要があります。また、長さをintからfloatに変換する必要があります。

let avg l =
    List.fold_left ( +. ) 0. l /. float_of_int (List.length l);;
于 2009-09-05T20:06:04.983 に答える