1

関数を作成し、そのリファクタリングを開始しましたが、「このプログラム ポイントより前の型情報に基づいて、メソッド 'Round' の一意のオーバーロードを決定できませんでした」という問題が発生しています。エラーですが、理由がわかりません。

let CheckValuesLin (lowValue, highValue) multiplier (sigFigs:int) =
    let arithmean (lowValue, highValue) =
        (lowValue + highValue) / 2.0
    let createRangeValue numberModifier meanfunction= 
        let mean = meanfunction (lowValue, highValue)
        let rangeValue = mean + (numberModifier mean) * multiplier
        Math.Round(rangeValue, sigFigs)
    let createRangeValues valueCreatingFunction=
        (createRangeValue makeNegative arithmean, createRangeValue keepPositive arithmean)
    let greatestMinValue, lowestMaxValue = createRangeValues createRangeValue
    (greatestMinValue, lowestMaxValue)

失敗する行は Math.Round 行で、 に設定rangeすると消えますrange: float。これは私を混乱させます。範囲と平均を含め、私がホバーしたものはすべて正しい型が既に推測されているように見えるからです。

型のヒントを入れてもかまいません。失敗する理由を知りたいだけです。

4

1 に答える 1

2

問題は、F# 型の推論が厳密に左から右、上から下に行われることです。

関数では、コンパイラはcreateRangeValueすべての値が数値であると推論することしかできず、型を強制するものは何もありませんfloat

arithmean後で を呼び出すと値の一部が float 型になるように見えますが、これは を呼び出した後に発生するRoundため、コンパイラは型を推測できません。

EDITいくつかの詳細:基本的にコンパイラはこれを見ます:

let lowValue = 0.0 //I am being genrous by making this have a type
let highValue = 0.0
let sigFigs = 0 //this type is known
let createRangeValue (numberModifier) (meanfunction) multiplier= 
    let mean = meanfunction (lowValue, highValue)    
    let rangeValue = mean + (numberModifier mean) * multiplier
    Math.Round(rangeValue, sigFigs)

この場合、存在するすべての制約を満たすいずれかまたは両方でrangeValueある可能性があります。floatDecimal

私にとって、これはうまくいきます

open System
let makeNegative a = -a
let keepPositive a = a
let CheckValuesLin (lowValue, highValue) multiplier (sigFigs:int) =
    let arithmean (lowValue, highValue) =
        (lowValue + highValue) / 2.0
    let createRangeValue numberModifier (meanfunction: float * float -> float)= 
        let mean = meanfunction (lowValue, highValue)
        let rangeValue = mean + (numberModifier mean) * multiplier
        Math.Round(rangeValue, sigFigs)
    let createRangeValues valueCreatingFunction=
        (createRangeValue makeNegative arithmean, createRangeValue keepPositive arithmean)
    let greatestMinValue, lowestMaxValue = createRangeValues createRangeValue
    (greatestMinValue, lowestMaxValue)
于 2013-06-28T09:36:27.650 に答える