Mastering Proxy in PureScript: A Practical Guide

by|inArticles||2 min read
Proxy Type-Level Programming<br>
Proxy Type-Level Programming<br>

PureScript, a strongly-typed functional programming language that compiles to JavaScript, offers a unique feature known as a Proxy. This blog post aims to demystify the concept of Proxy in PureScript, providing insights and practical examples to help you understand its usage and benefits in functional programming.

What is a Proxy in PureScript?

In PureScript, a Proxy is a type that carries no runtime data. It is often used in situations where we need to pass information about types to functions but don't need any actual data of that type. The Proxy type can be thought of as a placeholder that represents a type rather than a value.

Syntax and Basic Usage

The Proxy type is defined in the purescript-proxy package. Here’s how it is generally represented:

data Proxy a = Proxy

Why Use Proxy?

The main use of Proxy is in type-level programming. It allows us to provide type information to a function without needing a value of that type. This is particularly useful in scenarios where the type information cannot be inferred automatically or when we want to guide the type inference in a certain direction.

Practical Examples

To understand Proxy better, let's dive into some practical examples.

Example 1: Type-Guided Functions

Suppose we have a function that needs to behave differently based on a type, but we don’t have a value of that type to pass. Here, Proxy comes into play.

getClassification :: forall a. Proxy a -> String
getClassification (Proxy :: Proxy Int) = "Integer"
getClassification (Proxy :: Proxy String) = "Text"
getClassification _ = "Unknown"

Here, getClassification uses Proxy to determine the type and returns a string based on that type.

Example 2: Working with Type Classes

Proxy can be used to work with type classes where we need to pass type information but not actual values.

class Serializable a where
  serialize :: a -> String

instance serializableInt :: Serializable Int where
  serialize _ = "Integer"

serializeType :: forall a. Serializable a => Proxy a -> String
serializeType _ = serialize (undefined :: a)

-- Usage
-- serializeType (Proxy :: Proxy Int)

In this example, serializeType uses Proxy to utilize the Serializable type class without needing an actual value of type a.

Example 3: Advanced Type-Level Programming

Proxy can be instrumental in more advanced type-level programming, such as working with type-level lists or implementing type-level computations.

-- Example of type-level computation
type family Size a where
  Size Int = 'Small
  Size String = 'Large

sizeDescription :: forall a. Proxy a -> String
sizeDescription _ = reflectSymbol (Proxy :: Proxy (Size a))

-- Usage
-- sizeDescription (Proxy :: Proxy Int)

In this example, sizeDescription computes the size category of a type using Proxy.


The Proxy type in PureScript serves as a powerful tool for type-level programming. It allows developers to write more generic and reusable code by passing type information without needing corresponding values. Understanding and leveraging Proxy can significantly enhance your functional programming skills in PureScript.

Remember, Proxy is all about types and not values. Embracing this concept opens up a world of possibilities in the realm of type-level programming in PureScript.

Thank you for reading this far! Let’s connect. You can @ me on X (@debilofant) with comments, or feel free to follow. Please like/share this article so that it reaches others as well.

Related Articles

© Copyright 2024 - - All rights reservedVer. 415