簡體   English   中英

F#:類型推斷找不到正確的重載

[英]F#: Type inference not finding the correct overload

我已經編寫了一個函數並且已經開始對其進行重構,但是我遇到了一些問題,即“無法根據此程序之前的類型信息來確定方法'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時,該行將消失range: float 這使我感到困惑,因為我徘徊的所有內容似乎都已經推斷出正確的類型,包括范圍和均值。

我不介意輸入類型提示,我只是想知道為什么它會失敗。

問題是F#類型推斷嚴格從左到右,從上到下。

createRangeValue函數中,編譯器只能推斷所有值都是數字,沒有什么可以強制類型為float

雖然稍后對arithmean的調用似乎提供了一些值float類型,但這發生在對Round的調用之后,因此編譯器無法推斷類型。

編輯一些更多的細節:本質上,編譯器看到了這一點:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM