11 Ağustos 2021 Çarşamba

Programlama Dillerinde Dependent Typing Nedir?

Giriş
Çoğu programlama dili generics/template kullanımına izin veriyor. Dependent Typing  ise bundan bir adım ileride. Açıklaması şöyle
A language is called dependently typed if it also offers the possibility of defining functions from values to types. Or in other words, parameterizing a type definition over a value
- Template Type olarak bir değer kullanılmasına izin veriyor. 
- Ayrıca iki tane aynı tipin ayrımını da yapabiliyor

Örnek
Elimizde şöyle bir kod olsun
typedef std::map<int,int> IIMap;
IIMap foo;
IIMap bar;
Şu kod derlenir ancak aslında mantıken hatalıdır
IIMap::iterator i = foo.begin();
bar.erase(i);
Dolayısıyla tam anlamıyla Dependent Typing olan bir dilde bu kodun hata vermesi gerekir.
foo.iterator i = foo.begin();
bar.erase(i);  // ERROR: bar.iterator argument expected
C++
Kısmen Dependent Typing desteği vardır. Örneğin template parametresi olarak bir sayı geçilebilir.

Java
Dependent Typing desteklemez. Dolayısıyla şöyle bir kod derlenmez
/** 
 * String of a certain length n and a method to reduce to length n-1 
 */
public class StringN<int n> {
  private String str;
  public StringN (String str) {
    if (str.length() != n) {
      throw new IllegalArgumentException("string is not of required length!");
    }
    this.str = str;
  }

  public StringN<n-1> reduce() {
    return new StringN<n-1>(s.substring(0, s.length() - 1));
  }

  @Override
  public String toString() {
    return str;
  }
}

Hiç yorum yok:

Yorum Gönder