Ç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