Google News
logo
Scala - Interview Questions
What are higher-kinded types (HKTs) in Scala?
Higher-kinded types (HKTs) in Scala refer to types that take type constructors as type parameters. They provide a way to abstract over type constructors and enable generic programming over a wide range of data structures.

To understand higher-kinded types, it's important to understand the concept of type constructors. In Scala, a type constructor is a type that takes one or more type parameters and produces a new type when fully applied. Examples of type constructors in Scala include `List`, `Option`, and `Future`. These types are not complete types on their own but require type parameters to become concrete types.

Higher-kinded types allow us to parameterize over type constructors, enabling the creation of generic abstractions that work with a wide range of container-like types. This level of abstraction is achieved by introducing additional type parameters that represent the type constructors themselves.

Here's an example to illustrate higher-kinded types :
trait Functor[F[_]] {
  def map[A, B](fa: F[A])(f: A => B): F[B]
}

// Functor instance for List
implicit val listFunctor: Functor[List] = new Functor[List] {
  def map[A, B](fa: List[A])(f: A => B): List[B] = fa.map(f)
}

// Functor instance for Option
implicit val optionFunctor: Functor[Option] = new Functor[Option] {
  def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
}

// Usage
val list: List[Int] = List(1, 2, 3)
val option: Option[Int] = Some(42)

val newList = Functor[List].map(list)(_ * 2)
val newOption = Functor[Option].map(option)(_ + 10)​
In this example, we define a `Functor` type class that abstracts over types that can be mapped over. It takes a higher-kinded type `F[_]` as a type parameter. The `map` method in the `Functor` trait takes an instance `fa` of the type constructor `F` and applies the function `f` to transform the values within `F[A]` to `F[B]`.

We provide instances of the `Functor` type class for the `List` and `Option` type constructors. The `map` implementation for each type constructor is specific to that type, allowing us to map over lists and options using the `Functor` abstraction.

In the usage section, we create a `List` and an `Option`, and then use the `map` method from the `Functor` type class to transform the values within each container-like type. The `newList` and `newOption` variables contain the transformed values.

By using higher-kinded types and type classes, we can write generic code that works with different type constructors, abstracting over container-like types and defining common operations that are applicable to a wide range of data structures.

Higher-kinded types are a powerful feature in Scala that enable advanced abstractions and generic programming techniques, making it possible to write highly reusable and modular code.
Advertisement