diff --git a/src/model_03.rs b/src/model_03.rs
index 832e345..6dcb30a 100644
--- a/src/model_03.rs
+++ b/src/model_03.rs
@@ -1,4 +1,5 @@
 use std::{
+    fmt::Display,
     marker::PhantomData,
     pin::Pin,
     task::{Context, Poll},
@@ -383,9 +384,26 @@ pub trait AsTrace {
 
 pub enum Trace<'trace> {
     Pure,
-    Flatten(&'trace dyn AsTrace, &'trace dyn AsTrace),
     Map(&'trace dyn AsTrace),
     Join(&'trace dyn AsTrace, &'trace dyn AsTrace),
+    Flatten(&'trace dyn AsTrace, &'trace dyn AsTrace),
+}
+
+impl Display for &dyn AsTrace {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.as_trace())
+    }
+}
+
+impl Display for Trace<'_> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Self::Pure => write!(f, "."),
+            Self::Map(a) => write!(f, "{a}*"),
+            Self::Join(a, b) => write!(f, "({a},{b})"),
+            Self::Flatten(o, i) => write!(f, "{{{o};{i}}}"),
+        }
+    }
 }
 
 impl AsTrace for TracePure {