Cebirsel Veri Tipleri ile kolayca çözülebilen bazı problemler vardır, örneğin bir Liste tipi kısaca şöyle ifade edilebilir:
data ConsList a = Empty | ConsCell a (ConsList a)
consmap f Empty = Empty
consmap f (ConsCell a b) = ConsCell (f a) (consmap f b)
l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty))
consmap (+1) l
Bu özel örnek Haskell'dedir, ancak Cebirsel Veri Türleri için yerel desteği olan diğer dillerde benzer olacaktır.
OO tarzı alt tipleme için açık bir eşleme olduğu ortaya çıktı: veri türü soyut bir temel sınıf haline geldi ve her veri yapıcısı somut bir alt sınıf haline geldi. İşte Scala'da bir örnek:
sealed abstract class ConsList[+T] {
def map[U](f: T => U): ConsList[U]
}
object Empty extends ConsList[Nothing] {
override def map[U](f: Nothing => U) = this
}
final class ConsCell[T](first: T, rest: ConsList[T]) extends ConsList[T] {
override def map[U](f: T => U) = new ConsCell(f(first), rest.map(f))
}
val l = (new ConsCell(1, new ConsCell(2, new ConsCell(3, Empty)))
l.map(1+)
Naif subclassing ötesinde gerekli tek şey bir yoludur mühür imkansız bir hiyerarşiye alt sınıfları eklemek yapmak için bir yol, yani sınıflar.
Bu soruna C # veya Java gibi bir dilde nasıl yaklaşırsınız? C # 'da Cebirsel Veri Tiplerini kullanmaya çalışırken bulduğum iki engel:
- C # da alt tipin ne dendiğini anlayamadım (yani ne yazacağımı bulamadım
class Empty : ConsList< ??? >
) - Hiyerarşiye hiçbir alt sınıf eklenememesi için mühürlemenin bir yolunu bulamadım.
ConsList
Cebirsel Veri Tiplerini C # ve / veya Java ile uygulamanın en aptalca yolu ne olabilir? Ya da mümkün değilse, deyimsel ikame ne olurdu?