[英]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
可以是float
或Decimal
因為兩者都可以滿足存在的所有約束。
對我來說,這很好
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.