我所说的是无法定义以下内容:
在写完这个之后,我不太喜欢它...这种类型分类是否可以成为解糖过程的一部分?
当我在编写一些Aeson JSON解析时,我产生了这个想法。虽然对于每个数据类型只需派生
即使存在一些运行时开销,大多数人都不会介意,因为大多数代码几乎不需要高性能。
是否有一些隐藏的语言扩展实际上允许这样做?再次我不确定...但我认为Idris实际上可以做到这一点?
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年的邮件线程。最近有什么改变吗?即使存在一些运行时开销,大多数人都不会介意,因为大多数代码几乎不需要高性能。
是否有一些隐藏的语言扩展实际上允许这样做?再次我不确定...但我认为Idris实际上可以做到这一点?
Data.Aeson.TH
自动生成实例。它允许您规范化键,例如从记录字段名称中去除类型前缀。 - shang