1

これが私のコードです:

let avg l =
    List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
    let xbar = avg l in 
    let odp = (List.map (fun i -> ((float) i -. xbar) ** 2.0) l) in
    let sum = List.fold_left ( +. ) 0. odp in
    sum /. (float) length l;;

これをトップレベルに入力すると、次のようになります。

val avg : float list -> float = <fun>
#         Characters 107-108:
      let odp = (List.map (fun i -> ((float) i -. xbar) ** 2.0) l) in
                                                                ^
Error: This expression has type float list but is here used with type
         int list

私は長い間これを使用しようとしましたが、なぜこれがエラーを生成しているのかわかりません。lそれはintリストだと思っていますか?

解決策:(以下から。ありがとう!)

let avg l =
    List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
    let xbar = avg l in 
    let odp = (List.map (fun i -> (i -. xbar) ** 2.0) l) in
    let sum = List.fold_left ( +. ) 0. odp in
    sum /. (float) (List.length l);;
4

1 に答える 1

2

let xbar = avg lltype として推論されますがfloat list、これはあなたが望むもののようです。ただし、式では、マッピング関数でList.map (fun i -> ((float) i -. xbar) ** 2.0) l使用します。(float) iの型floatint -> floatであるため、itype と推測されintます。これによりl、 が type として推論され、 とのint list統合に失敗しfloat list、型チェック エラーが発生します。

最後の行も間違っていると思います。List.lengthだけでなく、を使用する必要があります。それ自体ではなく、lengthへの引数を括弧で囲む必要があると思います。floatfloat

このコードは動作するはずです:

let avg l =
    List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
    let xbar = avg l in 
    let odp = (List.map (fun i -> (i -. xbar) ** 2.0) l) in
    let sum = List.fold_left ( +. ) 0. odp in
    sum /. float (List.length l);;
于 2009-09-09T01:18:28.743 に答える