我正在學習f#。 考慮到這一功能:乘以十進制和整數F#
let mult (a:decimal) (b:int) : decimal = a * b
當我嘗試編譯我得到這個錯誤:錯誤 1種類型約束不匹配。 int類型與十進制類型不兼容
爲什麼編譯器不接受這個?
PS:當我明確地轉換它編譯:
let mult (a:decimal) (b:int) : decimal = a * decimal(b)
我正在學習f#。 考慮到這一功能:乘以十進制和整數F#
let mult (a:decimal) (b:int) : decimal = a * b
當我嘗試編譯我得到這個錯誤:錯誤 1種類型約束不匹配。 int類型與十進制類型不兼容
爲什麼編譯器不接受這個?
PS:當我明確地轉換它編譯:
let mult (a:decimal) (b:int) : decimal = a * decimal(b)
F#是非常嚴格的數字類型。有幾個原因。
4.0 * 8.5
可能不完全等於4*8.5
由於精度損失。通過強制您將4
轉換爲4.0
該語言已使精度損失清除類型推斷。函數需要具有具體的參數類型。如果我們允許從int
隱式轉換float
,它不會是清楚的a
類型應該是在這個例子中
let test a = a + 1.0
既是int
和float
可以爲a
是有效的類型是什麼。 (這可以通過內嵌函數來避免,其中參數類型的限制較少,並且使用genericZero
和genericOne
和genericOne
的一些函數
這實際上是語言的一個設計功能。目標是儘量減少副作用,並且不包括這兩種數據類型之間的隱式轉換。這裏的基本想法是,語言可以讓你做到這一點,但你必須意識到你正在這樣做,而不是簡單地不注意和乘以兩個數字,可能有意外的副作用