Try Install Learn Blog API Packages GitHub
Pages

Built in Types

Mint comes with several built in types. These are used in control expressions: Promise , Result , Void and Never. The Maybe type represents a nillable value.

Promise

The promise type represents a JavaScript promise - an asynchronous computational task that might fail.

In Mint promises have two parameters Promise(error, result) :

  • error - the type of the error
  • result - the type of the result

A good example is a HTTP request which in Mint looks like this:

Promise(Http.ErrorResponse, Http.Response)

where the Http.ErrorResponse is a record containing information about the error that happened while Http.Response is a record containing the response of the request.

Promises are used in a sequence and parallel expressions.

Result

The result type, represents a synchronous task that might fail. It is defined as an enum:

enum Result(error, value) {
  Err(error)
  Ok(value)
}

In Mint, results have two parameters Result(error, value):

  • error - the type of the error
  • value - the type of the value in the Ok case

For example, converting a String to a Number:

  • If the conversion fails we get an error:
    "blah"
    |> Number.fromString()
    |> Maybe.toResult("Conversion failed.")
    |> Result.isError() /* true */
  • If the conversion succeeds we get a value
    "10"
    |> Number.fromString()
    |> Maybe.toResult("Conversion failed.")
    |> Result.isOk() /* true */

Results are used in sequence , parallel and try expressions.

Void

The void type represents an expression which cannot have any value.

Void can only be explicitly returned with the void keyword.

Never

The never type is used to describe tasks (promises or results) that can never fail. For example, here is the type of task that can never fail: Promise(Never, String)

These tasks don't need to be caught in sequence , parallel and try expressions.

Maybe

The maybe type represents a value which may or may not exist. It's defined as an enum:

enum Maybe(value) {
  Just(value)
  Nothing()
}

For example here is a user who may or may not have a car:

record Car {
  type : String,
  engine : String
}

record User {
  name : String,
  car : Maybe(Car)
}