强制和重载有什么区别?

What is the difference between coercion and overloading?

我对这些条款感到困惑。据我所知,强制是当语言转换变量类型时,当语言使用相同的符号用于多个目的时重载。

从非常普遍的角度来看,主要区别在于 重载 是显式的(由程序员您控制),类型强制 是隐式的(由编译器控制)。

让我们暂时将计算机语言比作面包店:当 bake 函数重载时,您可以有许多不同的烤箱(实现),一个用于面包,一个用于披萨等. 有了强制,你只需要一个烤箱,但对于一些你想烤的东西,你需要一个小工具("coercion function")才能让它适应那个烤箱。

因此,对于重载,有多个实现(烤箱)由参数类型(食物)决定,对于强制,有多个强制函数(小工具)从每个参数类型(食物)到一种类型(烤箱需求)

不管你有很多小玩意,还是有很多烤箱,它们都应该由食物的类型来唯一确定。例如,当你有一个用于意大利食物的烤箱,另一个用于含有西红柿的食物时,你会遇到问题:如何处理比萨饼?这就是例如Haskell 程序员称为 "overlapping typeclasses"。有时可以解决,例如如果一个烤箱比另一个烤箱更专业(一个用于意大利食物,另一个用于托斯卡纳食物)