[Haskell-cafe] Hedgehog - Integrated shrinking, shrinks obey invariants by construction.
Li-yao Xia
lysxia at gmail.com
Fri Jun 15 12:50:04 UTC 2018
On 06/15/2018 07:31 AM, Petr Pudlák wrote:
> That's interesting! Could you please elaborate how this is implemented?
Sure. Whereas QuickCheck declares "shrink" as a function, in Hedgehog
generating and shrinking are performed simultaneously. Instead of
generating a single value, we can generate a rose tree of them, where
the main output is at the root, and the other nodes carry shrunk
versions of it, with the smallest ones at the leaves. It works quite
nicely and efficiently in Haskell thanks to laziness, so that the
shrinking part only happens as needed.
The main drawback might be that there is some duplicated work during
shrinking ((>>=) applies its second argument to different arguments),
but it is quite minor since shrinking is only needed in exceptional
cases, and it usually terminates in few steps.
Li-yao
More information about the Haskell-Cafe
mailing list