'da karşılıklı bağımlı varsayılan yöntem uygulamalarının çıkarılması İyi tanımlanmış bir ilişkiye sahip bazı özelliklere sahip bir özellik tanımlamak istiyorum - örneğin, a * b = c
. Bu özellik, bu özelliğin uygulamalarının bunlardan ikisini sağlayabilmesi ve otomatik olarak türetilen üçüncü özellik için bir erişim sahibinin bulunmasıdır. Eğer geri kalan sürece fonksiyonların herhangi bir alt kümesini tanımlayabiliriz olsa -Scala
( Bu Haskell'ın tip sınıfları aynı özelliği Doğru, sen (Ben doğru Haskell'ın tip sınıfları hatırlamıyorum)Ord
den <
tanımlı eğer bilinmeyenler hatırlarsanız, >=
! . <
olarak uygulanacağına dair olduğu . anlaşılmaktadır olabilir)
naif yaklaşım aslında oldukça iyi çalışıyor.
İştetrait Foo {
// a * b = c
def a: Double = c/b
def b: Double = c/a
def c: Double = a * b
}
class FooOne(override val a: Double, override val b: Double) extends Foo
class FooTwo(override val a: Double, override val c: Double) extends Foo
, uygulamaları FooOne
ve FooTwo
, Foo
'un tam uygulamalarıdır ve beklendiği gibi davranır. Çok uzak çok iyi; Bu yaklaşım, sınıfların özelliklerden iki tanesini tanımlamasına ve üçüncüsünü "ücretsiz" almasına izin verir.
Ancak, işler bir üçüncü sınıf tanımlıyorsa az pembe bakmaya başlar:
class FooFail(override val a: Double) extends Foo
Bu gayet derler - onun b
veya c
yöntemleri hiç değerlendirilirse ancak, bir yığın taşmasına neden olacaktır.
Yani naif yaklaşım Haskell'ın tip sınıf yaklaşımının çıkarsama yönünü verir, ama biz derleme zamanı güvenliği yok. İstediğim şey, derleyicinin, yöntemlerin ikiden azının, sınıfları uygulayarak tanımlanması durumunda şikayet etmesidir. Açıkçası mevcut sözdizimi burada yeterli değil; soyut ve düşünülen metotlara, eğer sadece bağımlı yöntemler soyut değilse, kullanılabilecek bir varsayılan uygulama ile olsa gerek.
Scala bunu tanımlamak için uygun semantik gösteriyor mu? (Bu dil için birinci sınıf bir desteğin farkında olmadığım için, union types'a benzer, onu tanımlamanın biraz dolambaçlı bir yolu varsa, bir sorunum yok). Aksi takdirde, saf olmayan yaklaşımla başa çıkacağım ve sadece sınıflarımı dikkatlice tanımlayıp test edeceğim. Ama bunun gerçekten de sistem tipinin yakalayabileceği bir şey olduğunu düşünüyorum (her şeyden önce - Ruby değil.).
Haskell tamamen yanlış tanımlamadıkça, aynı sorunla tam olarak aynı saf yaklaşımı kullanır. –
@Alexey - ilginç yorum. Biraz zaman geçti, ama eğer metodları yeterince tanımlamamış olsaydınız, satırlar boyunca bir derleyici/yorumlayıcı hatası alacağınızı, sınıf için tüm yöntemleri türetmenin mümkün olmadığını hatırlıyorum. Belki bunu yeniden üretmeye çalışacağım ve ilham için Haskell'in nasıl yaptığını okuyacağım. –
Tamam, bunu Haskell'de test ettikten sonra, gerçekten de aynı sorundan muzdariptir (Scala durumunun sadece tamamen soyut yöntemler hakkında uyarmasıyla eşdeğerdir). Bununla birlikte, soru başka bir dilde emsali olmadan da olsa hala geçerli. –