Varoluşçu türlerin arayüzlerden farkı nedir?


11

Varoluşçu tip verildiğinde

T = X.{op₁:X, op₂:Xboolean}

ve bu genel Java arayüzü:

interface T<X> {
    X op₁();
    boolean op₂(X something);
}

Varoluşsal tür ile Java arabirimi arasındaki temel farklar nelerdir?

Açıkçası sözdizimsel farklılıklar ve Java'nın nesne yönelimi vardır (gizli thisparametreler gibi ayrıntıları da içerir ). Bunlarla kavramsal ve anlamsal farklılıklarda olduğu kadar fazla ilgilenmiyorum - eğer biri daha ince noktalara ( Tvs. arasındaki notasyonel fark gibi) ışık tutmak isterse T<X>, bu da takdir edilecektir.


Yanıtlar:


4

Hmm ... Bu tanım uzun zaman önce gördüğüm bazı haskell örneğine çok benziyor.

{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]

Yapıcı Xuygulandığında ∀ aslında ∃ olur. Çıkardığınızda value, türü bilmediğinizi ve üzerinde boş bir işlem kümesinin olduğunu unutmayın. Ama onunla viewValueuyumlu olduğu için valueona uygulanabilir.

Sanırım interfaceönerdiğiniz Java'nın temel farkı, sonucu geçmek için ara türü bilmeniz op₁gerektiğidir op₂. Varoluşçu tip için uygun sistem, koşullara göre var olması garanti edilen doğru tipi seçmelidir. Yani sen türüyle işlevi yazmak gerekir: ∀X. X→(X→boolean)→T. Önceki örnekte böyle bir işlev kullanılan Xyapıcıdır X 3 show( showuygulayan Showve döndüren herhangi bir türün argümanını alan işlevdir String)

Güncellendi: Sorunuzu tekrar okudum ve Java için uygun bir yapım olduğunu düşünüyorum:

interface T {
    boolean op₂();
}
...
T x = new T() {
    private final int op = ...;
    public boolean op₂() { return ((op % 2) == 0); }
};
T y = new T() {
    private final char op = ...;
    public boolean op₂() { return ('0' <= op && op <= '9'); }
};
if (x.op₂() && y.op₂()) ...

Bahsetmek konusunda haklısınız this- aslında sizin op₁unuz.

Şimdi klasik OOP dillerinin (Java, C #, C ++ vb.) Her zaman tek bir değere sahip varoluşsal türü thisve bu değerle örtük olarak adlandırılan "yöntemler" adı verilen bir işlevi uyguladığını anladım :)

PS Maalesef Java'ya pek aşina değilim ama umarım bu fikre sahipsiniz.


Buna, işlevsel programlama desteği için Java 8'de tanıtılan Tek Soyut Yöntem (SAM) türüne bakmak isteyeceğinizi de ekleyeceğim.
Martijn Verburg

2

Tek fark, Java arayüzünün aslında Java derleyicisine bir şey ifade etmesidir.

Varoluşçu tür, herhangi bir dile özgü olmayan bir türün resmi tanımıdır. Bilgisayar bilimcileri bu tür tanımları, tür ve onu uygulayan diller hakkında şeyler kanıtlamak için kullanır. Java arayüzü, Java'nın resmi olarak tanımlanmış türdeki uygulamalarından biridir.


Hayır. cf william aşçı kağıt.
nicolas

2

Sunulan 2 tür birbirinden çok farklıdır. Yazdığınız arayüz tanımı evrensel bir tiptir (Java jenerikleri genellikle bu kategoriye girer).

Varoluşsal bir tür, uygulaması içinde bir türü tüketiciden gizler. Sezgisel olarak, X'in T'de varoluşu için, X'in kimliği herhangi bir tüketiciden bilinemez; bilinmesi gereken tek şey tanımda sağlanan işlemler kümesidir. Bazı X türleri için bir T tipi vardır.

Buna karşılık, evrensel bir tip, tüketicinin seçmekte serbest olduğu tüm tipler için geçerli işlemleri tanımlar. T tipi arayüz tam olarak budur. X, X'in tam olarak hangi tip olduğunu bilen tüketici tarafından başlatılır. Evrendeki her X tipi için bir T tipi vardır.

Varoluşçuluklar, Java'da sınırlı joker karakterler ( List<?>) durumu dışında bir dil yapısı olarak mevcut değildir . Ama evet, arayüzlerle taklit edilebilirler. Sorun daha sonra tasarım haline gelir.

Ony'nin işaret ettiği gibi, nesne yönelimli bir ortamda varoluşlar uygulamak zorlaşır, çünkü genellikle X'in tip bilgilerini kodlama şekliniz (onunla ne yapabilirsiniz) X'in uyguladığı bir arayüz tipinde üye işlevlerine sahip olmaktır. Kısacası, arayüzler bazı tip soyutlama yetenekleri satın alabilir, ancak varoluşun bir ölçüde ortadan kaldırılmasını gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.