2013-06-28 41 views
1

我写了一个功能,我已经开始重构它,但我有与方法‘圆’一个“独特的过载的一些问题无法确定依据在此节目点之前输入信息。“错误,但我不明白为什么。F#:类型推断没有找到正确的过载

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线,当我设置rangerange: float其消失的线。这让我感到困惑,因为我徘徊的一切似乎都已经有了正确的类型,包括范围和意思。

我不介意把类型暗示的,我只是想知道为什么会失败。

回答

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) 
+0

如果是这样的情况下,不会对float类型的“meanFunction”一类的提示*浮子>浮法解决这一问题?它不,所以也许我误解了你的答案? – Sean

+0

@Sean - 'numberModifier'中还有一个不错的类型 - 虽然我认为它应该被引用为'float - > float',但这并不是由于某种原因。虽然我不确定为什么 –

+0

@Sean - 我最初得到和你一样的错误,但是重置我的fsi使它消失了,我只在'meanfunction'中添加了一个注释,我 –