Generics
Generic functions#
Type parameters go in angle brackets after the name.
faber format --locale en — English reader surfacefn identitas<T>(T datum) → T {
return datum
}
main {
print identitas("Marcus")
print identitas(42)
}faber format --locale la — canonical Faberfunctio identitas<T>(T datum) → T {
redde datum
}
incipit {
nota identitas("Marcus")
nota identitas(42)
}faber format --locale th-TH — Thaiฟังก์ชัน identitas<T>(T datum) → T {
คืน datum
}
เริ่ม {
บันทึก identitas("Marcus")
บันทึก identitas(42)
}faber format --locale zh-Hans — Simplified Chinese函数 identitas<T>(T datum) → T {
返回 datum
}
入口 {
显示 identitas("Marcus")
显示 identitas(42)
}faber format --locale zh-Hant — Traditional Chinese函式 identitas<T>(T datum) → T {
傳回 datum
}
入口 {
註記 identitas("Marcus")
註記 identitas(42)
}faber format --locale vi — Vietnamesehàm identitas<T>(T datum) → T {
trả datum
}
bắt_đầu {
ghi_chú identitas("Marcus")
ghi_chú identitas(42)
}faber format --locale ar — Arabicدالة identitas<T>(T datum) → T {
أعد datum
}
بداية {
اعرض identitas("Marcus")
اعرض identitas(42)
}faber format --locale hi — Hindiफलन identitas<T>(T datum) → T {
लौटाओ datum
}
आरंभ {
दिखाओ identitas("Marcus")
दिखाओ identitas(42)
}The same function serves both calls. T is fixed per call site, not erased to
a dynamic value.
Generic with a union return#
Type parameters compose with unions, which is how "maybe nothing" is expressed generically.
faber format --locale en — English reader surfacefn primum<T>(list<T> res) → T ∪ null {
if res.longitudo() ≡ 0 then return null
return res[0]
}
main {
print primum([1, 2, 3])
}faber format --locale la — canonical Faberfunctio primum<T>(lista<T> res) → T ∪ nihil {
si res.longitudo() ≡ 0 ergo redde nihil
redde res[0]
}
incipit {
nota primum([1, 2, 3])
}faber format --locale th-TH — Thaiฟังก์ชัน primum<T>(รายการ<T> res) → T ∪ ว่าง {
ถ้า res.longitudo() ≡ 0 ดังนั้น คืน ว่าง
คืน res[0]
}
เริ่ม {
บันทึก primum([1, 2, 3])
}faber format --locale zh-Hans — Simplified Chinese函数 primum<T>(列表<T> res) → T ∪ 空 {
如果 res.longitudo() ≡ 0 则 返回 空
返回 res[0]
}
入口 {
显示 primum([1, 2, 3])
}faber format --locale zh-Hant — Traditional Chinese函式 primum<T>(列表<T> res) → T ∪ 空 {
若 res.longitudo() ≡ 0 則 傳回 空
傳回 res[0]
}
入口 {
註記 primum([1, 2, 3])
}faber format --locale vi — Vietnamesehàm primum<T>(danh_sách<T> res) → T ∪ rỗng {
nếu res.longitudo() ≡ 0 do_đó trả rỗng
trả res[0]
}
bắt_đầu {
ghi_chú primum([1, 2, 3])
}faber format --locale ar — Arabicدالة primum<T>(قائمة<T> res) → T ∪ لاشيء {
إذا res.longitudo() ≡ 0 إذن أعد لاشيء
أعد res[0]
}
بداية {
اعرض primum([1, 2, 3])
}faber format --locale hi — Hindiफलन primum<T>(सूची<T> res) → T ∪ शून्य {
यदि res.longitudo() ≡ 0 अतः लौटाओ शून्य
लौटाओ res[0]
}
आरंभ {
दिखाओ primum([1, 2, 3])
}Generic containers#
The built-in collections are generic already.
faber format --locale en — English reader surfacemain {
const list<string> nomina ← ["Marcus", "Julia"]
const map<string, int> aetates ← { "Marcus": 30 }
print nomina, aetates
}faber format --locale la — canonical Faberincipit {
fixum lista<textus> nomina ← ["Marcus", "Julia"]
fixum tabula<textus, numerus> aetates ← { "Marcus": 30 }
nota nomina, aetates
}faber format --locale th-TH — Thaiเริ่ม {
คงที่ รายการ<ข้อความ> nomina ← ["Marcus", "Julia"]
คงที่ ตาราง<ข้อความ, จำนวน> aetates ← { "Marcus": 30 }
บันทึก nomina, aetates
}faber format --locale zh-Hans — Simplified Chinese入口 {
常量 列表<文本> nomina ← ["Marcus", "Julia"]
常量 映射<文本, 整数> aetates ← { "Marcus": 30 }
显示 nomina, aetates
}faber format --locale zh-Hant — Traditional Chinese入口 {
定值 列表<文字> nomina ← ["Marcus", "Julia"]
定值 表格<文字, 整數> aetates ← { "Marcus": 30 }
註記 nomina, aetates
}faber format --locale vi — Vietnamesebắt_đầu {
hằng danh_sách<văn_bản> nomina ← ["Marcus", "Julia"]
hằng bảng<văn_bản, số> aetates ← { "Marcus": 30 }
ghi_chú nomina, aetates
}faber format --locale ar — Arabicبداية {
ثابت قائمة<نص> nomina ← ["Marcus", "Julia"]
ثابت جدول<نص, عدد> aetates ← { "Marcus": 30 }
اعرض nomina, aetates
}faber format --locale hi — Hindiआरंभ {
स्थिर सूची<पाठ> nomina ← ["Marcus", "Julia"]
स्थिर तालिका<पाठ, संख्या> aetates ← { "Marcus": 30 }
दिखाओ nomina, aetates
}Records#
class declares a record type with type-first fields.
faber format --locale en — English reader surfaceclass Persona {
string nomen
int aetas
}
fn descriptio(Persona p) → string {
return p.nomen
}
main {
const Persona p ← Persona {nomen = "Marcus", aetas = 30}
print descriptio(p)
}faber format --locale la — canonical Fabergenus Persona {
textus nomen
numerus aetas
}
functio descriptio(Persona p) → textus {
redde p.nomen
}
incipit {
fixum Persona p ← Persona {nomen = "Marcus", aetas = 30}
nota descriptio(p)
}faber format --locale th-TH — Thaiชนิด Persona {
ข้อความ nomen
จำนวน aetas
}
ฟังก์ชัน descriptio(Persona p) → ข้อความ {
คืน p.nomen
}
เริ่ม {
คงที่ Persona p ← Persona {nomen = "Marcus", aetas = 30}
บันทึก descriptio(p)
}faber format --locale zh-Hans — Simplified Chinese类 Persona {
文本 nomen
整数 aetas
}
函数 descriptio(Persona p) → 文本 {
返回 p.nomen
}
入口 {
常量 Persona p ← Persona {nomen = "Marcus", aetas = 30}
显示 descriptio(p)
}faber format --locale zh-Hant — Traditional Chinese類型 Persona {
文字 nomen
整數 aetas
}
函式 descriptio(Persona p) → 文字 {
傳回 p.nomen
}
入口 {
定值 Persona p ← Persona {nomen = "Marcus", aetas = 30}
註記 descriptio(p)
}faber format --locale vi — Vietnamesekiểu Persona {
văn_bản nomen
số aetas
}
hàm descriptio(Persona p) → văn_bản {
trả p.nomen
}
bắt_đầu {
hằng Persona p ← Persona {nomen = "Marcus", aetas = 30}
ghi_chú descriptio(p)
}faber format --locale ar — Arabicصنف Persona {
نص nomen
عدد aetas
}
دالة descriptio(Persona p) → نص {
أعد p.nomen
}
بداية {
ثابت Persona p ← Persona {nomen = "Marcus", aetas = 30}
اعرض descriptio(p)
}faber format --locale hi — Hindiवर्ग Persona {
पाठ nomen
संख्या aetas
}
फलन descriptio(Persona p) → पाठ {
लौटाओ p.nomen
}
आरंभ {
स्थिर Persona p ← Persona {nomen = "Marcus", aetas = 30}
दिखाओ descriptio(p)
}Functions on a record#
A class can carry functions alongside its fields.
faber format --locale en — English reader surfaceclass Punctum {
int x
int y
fn summa() → int {
return self.x + self.y
}
}
main {
const Punctum p ← Punctum {x = 1, y = 2}
print p.summa()
}faber format --locale la — canonical Fabergenus Punctum {
numerus x
numerus y
functio summa() → numerus {
redde ego.x + ego.y
}
}
incipit {
fixum Punctum p ← Punctum {x = 1, y = 2}
nota p.summa()
}faber format --locale th-TH — Thaiชนิด Punctum {
จำนวน x
จำนวน y
ฟังก์ชัน summa() → จำนวน {
คืน ตัวฉัน.x + ตัวฉัน.y
}
}
เริ่ม {
คงที่ Punctum p ← Punctum {x = 1, y = 2}
บันทึก p.summa()
}faber format --locale zh-Hans — Simplified Chinese类 Punctum {
整数 x
整数 y
函数 summa() → 整数 {
返回 自身.x + 自身.y
}
}
入口 {
常量 Punctum p ← Punctum {x = 1, y = 2}
显示 p.summa()
}faber format --locale zh-Hant — Traditional Chinese類型 Punctum {
整數 x
整數 y
函式 summa() → 整數 {
傳回 自身.x + 自身.y
}
}
入口 {
定值 Punctum p ← Punctum {x = 1, y = 2}
註記 p.summa()
}faber format --locale vi — Vietnamesekiểu Punctum {
số x
số y
hàm summa() → số {
trả tôi.x + tôi.y
}
}
bắt_đầu {
hằng Punctum p ← Punctum {x = 1, y = 2}
ghi_chú p.summa()
}faber format --locale ar — Arabicصنف Punctum {
عدد x
عدد y
دالة summa() → عدد {
أعد ذات.x + ذات.y
}
}
بداية {
ثابت Punctum p ← Punctum {x = 1, y = 2}
اعرض p.summa()
}faber format --locale hi — Hindiवर्ग Punctum {
संख्या x
संख्या y
फलन summa() → संख्या {
लौटाओ मैं.x + मैं.y
}
}
आरंभ {
स्थिर Punctum p ← Punctum {x = 1, y = 2}
दिखाओ p.summa()
}ego — "I" — is the receiver, what other languages spell this or self.
Related: Types and widths · Functions and flow