我正在学习f#。 考虑到这个功能:
let mult (a:decimal) (b:int) : decimal = a * b
当我尝试编译时,我收到此错误: 错误1类型约束不匹配。 int类型与十进制类型
不兼容为什么编译器不接受这个?
PS:当我明确转换时,它会编译:
let mult (a:decimal) (b:int) : decimal = a * decimal(b)
答案 0 :(得分:4)
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
答案 1 :(得分:3)
这实际上是该语言的设计特征。目标是尽量减少副作用,因此不包括这两种数据类型之间的隐式转换。这里的基本思想是语言将允许你这样做,但你必须意识到你正在这样做,而不是简单地不注意并将两个数字乘以可能的意外副作用