2014-04-25 93 views
4

我正在學習f#。 考慮到這一功能:乘以十進制和整數F#

let mult (a:decimal) (b:int) : decimal = a * b 

當我嘗試編譯我得到這個錯誤:錯誤 1種類型約束不匹配。 int類型與十進制類型不兼容

爲什麼編譯器不接受這個?

PS:當我明確地轉換它編譯:

let mult (a:decimal) (b:int) : decimal = a * decimal(b) 

回答

4

F#是非常嚴格的數字類型。有幾個原因。

  1. 精密 - 轉換爲浮點時4.0 * 8.5可能不完全等於4*8.5由於精度損失。通過強制您將4轉換爲4.0該語言已使精度損失清除
  2. 類型推斷。函數需要具有具體的參數類型。如果我們允許從int隱式轉換float,它不會是清楚的a類型應該是在這個例子中

    let test a = a + 1.0 
    

    既是intfloat可以爲a是有效的類型是什麼。 (這可以通過內嵌函數來避免,其中參數類型的限制較少,並且使用genericZerogenericOnegenericOne的一些函數

  3. 簡單。現貨。
3

這實際上是語言的一個設計功能。目標是儘量減少副作用,並且不包括這兩種數據類型之間的隱式轉換。這裏的基本想法是,語言可以讓你做到這一點,但你必須意識到你正在這樣做,而不是簡單地不注意和乘以兩個數字,可能有意外的副作用