#plausible #hlist #functional #heterogeneous #list


Provides support for heterogeneous lists (known as HLists), which are functional, tuple-like, strongly-typed data structures that can contain elements of differing types

2 stable releases

1.0.1 Jun 28, 2020
1.0.0 Sep 13, 2019

#909 in Data structures

22 downloads per month
Used in rcodec

MIT license

132 lines


Build Status Crates.io Docs.rs MIT licensed

This Rust library provides support for heterogeneous lists (known as HLists). An HList is a functional, tuple-like, strongly-typed data structure that can contain elements of differing types.

There are three layers in this library:

  • A basic HList data structure consisting of HCons and HNil types.
  • An hlist! macro for constructing an HList from a series of elements.
  • An HListSupport plugin/attribute that, when declared for a struct, allows for easy conversion of struct instances to/from an HList representation.

See the next section for more details on usage of these layers.


Add a dependency to your Cargo.toml:

pl-hlist = "1.0"

Then, in your crate:

use pl_hlist::*;

An HList can be constructed manually as follows:

let x: HCons<u8, HCons<u32, HNil>> = HCons(1u8, HCons(666u32, HNil));

The hlist! macro provides a convenient shorthand for constructing an HList:

let x: HCons<u8, HCons<u32, HNil>> = hlist!(1u8, 666u32);

The custom HListSupport derive attribute can be applied to a struct declaration to automatically implement support for converting that struct to/from an HList representation:

struct TestStruct {
    foo: u8,
    bar: u32

let hlist0 = hlist!(1u8, 666u32);
let s = TestStruct::from_hlist(hlist0);
assert_eq!(s.foo, 1u8);
assert_eq!(s.bar, 666u32);
let hlist1 = s.into_hlist();
assert_eq!(hlist0, hlist1);


pl-hlist is distributed under an MIT license. See LICENSE for more details.


~26K SLoC