私が話しているのは、次のことを定義することはできないということです。
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
が簡単すぎる場合は、すべてを手作業で書き出す必要がありました(現在は1,000行を超えてカウントしています)。name
データレコードのような、または単にデータレコードに名前を付けるvalue
ことは、それほど珍しいことではありません。
http://www.haskell.org/haskellwiki/Performance/Overloadingは、関数のオーバーロードが実行時のオーバーヘッドをもたらすと述べています。しかし、実際には、コンパイラがコンパイル時にこれを解決できず、内部で異なる名前を付けることができない理由がわかりません。
2012年のこのSOの質問は、多かれ少なかれ歴史的な理由を述べており、2006年のメールスレッドを指しています。最近何か変わったことはありますか?
実行時のオーバーヘッドがいくらかあるとしても、ほとんどの人は気にしないでしょう。ほとんどのコードはパフォーマンスが重要ではないからです。
これを実際に可能にする隠された言語拡張機能はありますか?繰り返しますが、よくわかりません...しかし、イドリスは実際にこれを行っていると思いますか?