Using reverse
breaks fusion:
findR expensive fused: OK
55.6 ns ± 3.5 ns, 671 B allocated, 0 B copied, 7.0 MB peak memory
findR cheap fused: OK
24.0 μs ± 1.8 μs, 312 KB allocated, 12 KB copied, 7.0 MB peak memory
findR' expensive fused: OK
691 ns ± 55 ns, 645 B allocated, 0 B copied, 7.0 MB peak memory
findR' cheap fused: OK
19.1 μs ± 1.6 μs, 156 KB allocated, 9 B copied, 7.0 MB peak memory
findR'' expensive fused: OK
238 ns ± 21 ns, 2.0 KB allocated, 0 B copied, 7.0 MB peak memory
findR'' cheap fused: OK
130 μs ± 6.8 μs, 937 KB allocated, 44 KB copied, 7.0 MB peak memory
That’s when I add these benchmarks:
, bench "findR expensive fused" $ nf (\(x,y,z) -> findR (even . fib) (enumFromThenTo x y z)) (20,19,1 :: Int)
, bench "findR cheap fused" $ nf (findR even . uncurry enumFromTo) (1,10000 :: Int)