
dons:
Showing what transformations happened. Notably, 2 occurences of the "streamU/unstreamU" transformation, to remove intermediate structures.
The final code looks like:
$s$wfold :: Int# -> Int# $s$wfold = \ (sc_s19l :: Int#) -> case modInt# (-9223372036854775807) 3 of wild21_a14L { __DEFAULT -> case modInt# (-9223372036854775807) 5 of wild211_X159 { __DEFAULT -> $wfold sc_s19l (-9223372036854775806); 0 -> $wfold (+# sc_s19l (-9223372036854775807)) (-9223372036854775806) }; 0 -> $wfold (+# sc_s19l (-9223372036854775807)) (-9223372036854775806) } $wfold :: Int# -> Int# -> Int#
Oh, this is also a good illustration of why you should use `rem` instead of `mod` , if you're not expecting negative numbers: The core with filterU (\x -> x `rem` 3 == 0 || x `rem` 5 == 0) avoids all the checks for -9223372036854775806. $s$wfold :: Int# -> Int# $s$wfold = \ (sc_s18m :: Int#) -> $wfold sc_s18m (-9223372036854775806) $wfold :: Int# -> Int# -> Int# $wfold = \ (ww_s17v :: Int#) (ww1_s17z :: Int#) -> case ># ww1_s17z 999 of wild_a15d { False -> case ww1_s17z of wild2_a14K { __DEFAULT -> case remInt# wild2_a14K 3 of wild1_B1 { __DEFAULT -> case remInt# wild2_a14K 5 of wild21_Xp { __DEFAULT -> $wfold ww_s17v (+# wild2_a14K 1); 0 -> $wfold (+# ww_s17v wild2_a14K) (+# wild2_a14K 1) }; 0 -> $wfold (+# ww_s17v wild2_a14K) (+# wild2_a14K 1) }; (-9223372036854775808) -> $s$wfold ww_s17v }; True -> ww_s17v } Yes, that's better code. But remember, Prelude Test.QuickCheck> quickCheck (\x -> x `mod` 3 == x `rem` 3) Falsifiable, after 2 tests: -1 -- Don