[Haskell-cafe] eta-expansion and cost of extra thunk on ghc

Jeff Clites jclites at mac.com
Mon May 15 05:36:39 UTC 2017

I don't think it's always free; I believe you'll incur the cost at least of allocating the closure to capture outstate in that lambda in the canonical case. But, if you are thinking of the code:

    runState (join x) y

then it's likely that GHC will inline away everything such that it's free, but not so in the case in which you (say) store the result of join in some data structure and run it elsewhere.

So I'd say whether it's free depends on exactly what code you are comparing it to, and I think it's a question of whether GHC has the opportunity to inline everything, not a direct consequence of the similarity to a lambda calculus primitive; that doesn't inherently make anything free.


> On May 14, 2017, at 10:40 AM, Ruben Astudillo <ruben.astud at gmail.com> wrote:
> Dear list
> On a class, we recently discussed the join function for a (State s)
> value (we where implementation Monad passing through Functor)
>    join :: State s (State s a) -> State s a
>    join outstate =
>        State $ \s0 ->
>            let (innerstate, s1) = runState outstate s0
>            in  runState innerstate s1
> On this, we eta-expand outstate to in a sense "pattern match" on what we
> know about it. We were thinking on the cost of the extra wrapping we do
> here for this "pattern matching". Because eta-expanding is one a of the
> 3 primitive operations on lambda calculus, we concluded it should be
> free (modulo presence of seq). Is this true on ghc?
> -- 
> -- Ruben
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.

More information about the Haskell-Cafe mailing list