K
-fno-cse, или разные аргументы для bar, иначе ghc сделает let x = bar (); y = print x in y >> yВо-вторых, нужно что-то типа такого:
ping :: forall a. Show a => a -> IntСамо по себе noinline здесь не помогает, суть в том, что из-за него ghc не знает, будет ли вычислен аргумент ping, поэтому не может вынести
ping x = traceShow ("ping", x) 42
{-# NOINLINE bar #-}
bar :: a -> Int
bar a = noinline ping (a `seq` ())
seq a вперед и убрать зависимось ping от аргумента, поэтому и не выносит-O1 выводит только 1 раз.import Debug.Trace
import GHC.Magic (noinline)
ping :: Show a => a -> Int
ping x = traceShow ("ping", x) 42
{-# NOINLINE bar #-}
bar :: a -> Int
bar a = noinline ping (a `seq` ())
main = do
print $ bar ()
print $ bar ()



