[GHC] #15143: Passing an IO value through several functions results in program hanging.

GHC ghc-devs at haskell.org
Fri May 18 03:52:25 UTC 2018


#15143: Passing an IO value through several functions results in program hanging.
-------------------------------------+-------------------------------------
        Reporter:  Burtannia         |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Runtime           |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Burtannia):

 Replying to [comment:5 danilo2]:

 I think you were right that it's to do with the strictness of the value. I
 don't know a huge amount but here is my interpretation.

 > {{{
 > !r     <- mr -- | Performance
 > buildLayerFold @t @m @layer layer $! pure r
 > }}}

 This performs the monadic action `mr`, binds the result to `r` and forces
 that value to be fully evaluated.

 `$! pure r` forces `pure r` to be fully evaluated. Note that `pure r`
 isn't a value, it's a monadic computation that returns a value.

 From what I understand, your test:

 > {{{
 > !_ <- mr
 > buildLayerFold @t @m @layer layer mr
 > }}}

 isn't doing what you think it's doing. `!_ <- mr` says ''perform the
 monadic action `mr` and strictly evaluate its result''. You then pass the
 monadic action `mr` as an argument to the function on the next line. Note
 that the computation `mr` is not strictly evaluated here.
 Later during the execution, that computation will be performed again but
 must first be evaluated. I'm presuming this "second evaluation" is why it
 runs two times slower. Again I'm not 100% sure that I'm correct on this.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15143#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list