我在说的是无法定义:
data A = A {name :: String}
data B = B {name :: String}
我知道 GHC 只是将其简化为普通函数,解决此问题的惯用方法是:
data A = A {aName :: String}
data B = B {bName :: String}
class Name a where
name :: a -> String
instance Name A where
name = aName
instance Name B where
name = bName
写完后我不太喜欢它……这种类型分类不能成为脱糖过程的一部分吗?
当我写一些 Aeson JSON 解析时,我想到了。如果只为每种数据类型派生FromJSON
实例太容易了,我必须手动写出所有内容(目前 > 1k 行并计数)。在数据记录中具有类似name
或简单的名称value
并不少见。
http://www.haskell.org/haskellwiki/Performance/Overloading提到函数重载会引入一些运行时开销。但我实际上不明白为什么编译器无法在编译时解决这个问题并在内部给它们不同的名称。
这个 2012 年的 SO 问题或多或少地说明了历史原因,并指向了 2006 年的一个邮件线程。最近有什么变化吗?
即使会有一些运行时开销,大多数人也不会介意,因为大多数代码几乎不是性能关键。
是否有一些隐藏的语言扩展实际上允许这样做?我再次不确定......但我认为伊德里斯实际上是这样做的?