A derived combinator is a compositional operation defined from other operations rather than provided as a primitive. Separating the pieces keeps policy decisions local and lets useful behavior grow from single-purpose parts. section 7.1.3
Deriving lazyUnit
A strict primitive can support a nonstrict operation without knowing Par’s representation: `def unit[A](a: A): Par[A]` and `def lazyUnit[A](a: => A): Par[A] = fork(unit(a))`. The derived operation combines `unit` with `fork`, preserving the distinction between producing a value and controlling when it is evaluated. section 7.1.3
The same design scales to monads. Implementing a minimal set such as `unit` and `flatMap`, or `unit`, `map`, and `join`, provides access to derived operations while the monad laws constrain their composition. section 11.7
def unit[A](a: A): Par[A] def lazyUnit[A](a: => A): Par[A] = fork(unit(a))
Inspect the primitive and derived definitions side by side. section 7.1.3
