Треки
/
Gleam
Gleam
/
Салабус
/
Фантомні типи
Фа

Фантомні типи у Gleam

1 вправа

Про концепцію Фантомні типи

Фантомні типи - це параметри типу власного типу, які не використовуються в жодному з конструкторів значень цього типу.

Це досить абстрактно, тож ось приклад:

pub type Length(unit) {
  Length(amount: Float)
}

У цьому прикладі параметр типу unit не використовується в конструкторі значень Length, тому unit - фантомний тип.

Цей невикористаний параметр типу може здатися непотрібним, але з його допомогою можна додати додаткові обмеження на те, як можна використовувати значення Length.

Наприклад, у нас могла б бути функція double, яка множить довжину. Вона працює з довжинами в будь-яких одиницях, тому параметр типу є узагальненою змінною типу.

// This function accepts all Length values
pub fn double(length: Length(unit)) -> Length(unit) {
  Length(length.amount *. 2.0)
}

Також могла б бути функція add_inch, яка працює лише тоді, коли довжина задана в дюймах.

// A unit type for inches. It is never constructed so we don't
// define any constructors for it.
pub type Inches

pub fn add_inch(length: Length(Inches)) -> Length(Inches) {
  Length(length.amount +. 1.0)
}

Функція add_inch не прийме довжини з будь-яким іншим параметром одиниці: фантомний тип використано, щоб гарантувати застосування лише правильної одиниці.

Функцію можна також написати так, щоб гарантувати, що два значення довжини мають однакову одиницю, використавши для обох ту саму змінну типу.

pub fn add(a: Length(unit), b: Length(unit)) -> Length(unit) {
  Length(a.amount +. b.amount)
}
let two_meters: Length(Meters) = Length(2.0)
let two_inches: Length(Inches) = Length(2.0)

add(two_meters, two_meters)
// -> Length(4.0): Length(Meters)

add(two_meters, two_inches)
// Type error! The unit type parameters do not match.

Фантомні типи добре поєднуються з непрозорими типами. Якщо інші модулі не можуть створювати значення Length, тоді ми можемо гарантувати, що їх не створять із хибним типом одиниці, і що з ними можна використовувати лише функції, визначені вище.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Фантомні типи