McCarthy's Ambiguous Operator (2005)
amb without side-effects can also be expressed in terms of the List monad, e.g.:    do x <- [1, 2, 3]
       y <- [4, 5, 6]
       if x * y == 8 then pure (x, y)
                     else []

which can be equivalently reworded as the list comprehension:    [(x, y) | x <- [1, 2, 3], y <- [4, 5, 6], x * y == 8]

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.