K
noInline
на STGSize: a a a
K
noInline
на STGAA
K
foo :: a -> [Int]
foo a = noinline enumFromTo 1 (seq a 1000)
ghc-8.8.2
в GHC.Exts
никакого noinline
нету. А вот в пакете base-4.15.0.0
- есть. Это под какую версию компилятора-то?KV
ghc-8.8.2
в GHC.Exts
никакого noinline
нету. А вот в пакете base-4.15.0.0
- есть. Это под какую версию компилятора-то?K
K
foo :: a -> [Int]
foo a = noinline enumFromTo 1 (seq a 1000)
import Debug.Trace
import GHC.Magic (noinline)
ping :: Show a => a -> Int
ping x = traceShow ("ping", x) 42
bar :: () -> Int
bar () = noinline ping ()
main = do
print $ bar ()
print $ bar ()
AA
import Debug.Trace
import GHC.Magic (noinline)
ping :: Show a => a -> Int
ping x = traceShow ("ping", x) 42
bar :: () -> Int
bar () = noinline ping ()
main = do
print $ bar ()
print $ bar ()
K
AA
K
noinline f x
действует только в этом виде?AA
K
foo :: () -> Int
foo = ping
bar = noinline foo
AA
IO
-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 от аргумента, поэтому и не выносит