乘以十进制和整数F#

时间:2014-04-25 19:50:44

标签: f# type-conversion

我正在学习f#。 考虑到这个功能:

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

当我尝试编译时,我收到此错误: 错误1类型约束不匹配。 int类型与十进制类型

不兼容

为什么编译器不接受这个?

PS:当我明确转换时,它会编译:

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

2 个答案:

答案 0 :(得分: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的有效类型。 (这可以通过内联函数来避免,其中对参数类型的限制较少,并且使用某些函数,例如genericZerogenericOne

  3. 简单。由于没有自动类型转换,任何转换都会立即变得明显,并且一些错误变得更加容易发现。

答案 1 :(得分:3)

这实际上是该语言的设计特征。目标是尽量减少副作用,因此不包括这两种数据类型之间的隐式转换。这里的基本思想是语言将允许你这样做,但你必须意识到你正在这样做,而不是简单地不注意并将两个数字乘以可能的意外副作用