McCarthy's Ambiguous Operator (2005)
amb without side-effects can also be expressed in terms of the List monad, e.g.:<p><pre><code>    do x <- [1, 2, 3]
       y <- [4, 5, 6]
       if x * y == 8 then pure (x, y)
                     else []
</code></pre>
which can be equivalently reworded as the list comprehension:<p><pre><code>    [(x, y) | x <- [1, 2, 3], y <- [4, 5, 6], x * y == 8]
</code></pre>
i.e., the underlying structure of amb without side-effects can also be understood as just a search of the input space for values that fulfill some criteria, rather than as backtracking via continuations.