web-dev-qa-db-ja.com

なぜScalaのEitherとOptionタイプはインターフェース/トレイトではなくクラスなのですか?

クラスCompileResultを作成したいと思います。これはEither型のように扱うことができますが、いくつかの便利なメソッドが追加されています。 CompileSuccessまたはCompileFailureである必要があります(これらにも拡張機能がいくつかあります)。ただし、Eitherabstract classであり、拡張したくないため、委任を使用してEitherを内部に格納しているため、これを行うことはできません。

だから私の質問は、なぜEitherが抽象クラスになっているのか(また、なぜ以前の特性だったのか)、なぜインターフェースを使用しなかったのですかオプションについても同様です。

7
valenterry

Eitherへの変更は、2008年4月24日に commit c0b21797bde81861305dd68853add2d8bd46e484 "isLeftとisRightを変更してメモリ使用量を減らしました。"

IsLeftとisRightを変更して、メモリ使用量を減らしました。

完全なチェックを可能にするために、密封された特性から密封された抽象クラスに変更されました。

#797 のディスカッションごとのすべての変更。

参照されているバグレポートは SI-797 "どちらか一方の遅延値はおそらくdefsである必要があります"

これは David R. MacIverによるコメント

私が提案している間、どちらかがシールされた抽象クラスで、パターンマッチの警告が表示されるようにした方がいいのではないでしょうか。

その間、Scala実際にはdoessealed traitsとsealed abstract classes、これはもう必要ありませんが、これもあります Geoffrey Alan Washburnによるコメント

左と右が最終的なものであることを考えると、誰かがEitherをミックスインとして使用することができる賢明な方法を私は見ることができません。

したがって、Eithertraitでないことは、依然として意味があります。

Optionについては、2006年3月9日の commit 0bef86d8e8b7ea7ebb790ebcec7fedcb9a24f5a8 ではsealedでしたが、それ以前はabstract classでした。

traitからabstract classへの変更は、2006年3月3日に commit d7007f7a9607481eb73b8df587e3c52cf4272147 "Use 'mixin class'ではなく 'trait'"を使用 で行われました。

なぜそれらがインターフェースではないのかについては、その答えはかなり単純です:Scalaにはインターフェースがありません。少なくともJavaの意味では、またはC#。

10
Jörg W Mittag