Tech
June 29, 2026
0 views
1 min read

Type-checked non-empty strings

Source: Hacker News
Type-checked non-empty strings
Tech Daily Byte Analysis

Bellroy's engineers employed a novel technique in their Haskell codebase to create a type-checked non-empty string constructor, dubbed NonEmptyText. By leveraging GHC 9.10's RequiredTypeArguments and type families, they replaced thousands of TemplateHaskell calls with a more efficient and type-safe solution, yielding a 10% reduction in compilation time for their data-heavy package. This development showcases the company's commitment to software design goals, particularly making invalid states unrepresentable.

The use of RequiredTypeArguments and type families enables developers to define type-level predicates, allowing for more expressive and safer code. In this case, the IsNonEmptySymbol type family checks if a given string is non-empty at the type level, providing a custom error message if it's empty. This approach can be generalized to validate other types, such as Natural numbers or more complex data structures. For instance, Bellroy's developers applied a similar technique to create a type-checked Positive constructor and even explored type-level parsing for DynamoDB table names.

The implications of this technique are significant, as it enables developers to write more robust and maintainable code. However, it also requires careful consideration of GHC's language extensions, such as UndecidableInstances, which can introduce complexity and potential risks. As Bellroy's engineers continue to push the boundaries of Haskell's type system, they must balance the benefits of advanced type checking with the potential costs of increased complexity and debugging challenges.

Key Takeaways

Bellroy's developers replaced thousands of TemplateHaskell calls with a type-checked non-empty string constructor, achieving a 10% build-time improvement.

The technique utilizes GHC 9.10's RequiredTypeArguments and type families to define type-level predicates.

This approach can be generalized to validate other types, such as Natural numbers or complex data structures.

The use of UndecidableInstances requires careful consideration to balance benefits and potential risks.

About the Source

This analysis is based on reporting by Hacker News. Here is a short excerpt for context:

Comments
Read the original at Hacker News

More in Tech