
#9540: unwords is not a good producer -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.9 Keywords: fusion | Operating System: Architecture: Unknown/Multiple | Unknown/Multiple Difficulty: Easy (less than 1 | Type of failure: Runtime hour) | performance bug Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- I think we can do something like this, once we've fixed `unfoldr`: {{{#!hs unwords = unfoldr go where go [] = Nothing go ("":ws) = Just (' ', ws) go ((l:ls):ws) = Just (l, ls:ws) }}} With my draft `unfoldr`, GHC turns this into {{{#!hs lvl_r1EN lvl_r1EN = C# ' ' Rec { unwords_$sgo unwords_$sgo = \ sc_s1Gx sc1_s1Gy -> case sc_s1Gx of _ { [] -> : lvl_r1EN (unwords_go sc1_s1Gy); : l_a1Ew ls_a1Ex -> : l_a1Ew (unwords_$sgo ls_a1Ex sc1_s1Gy) } unwords_go unwords_go = \ b1_a1Fb -> case b1_a1Fb of _ { [] -> []; : ds_d1F5 ws_a1Ev -> case ds_d1F5 of _ { [] -> : lvl_r1EN (unwords_go ws_a1Ev); : l_a1Ew ls_a1Ex -> : l_a1Ew (unwords_$sgo ls_a1Ex ws_a1Ev) } } end Rec } unwords unwords = \ b'_a1F9 -> unwords_go b'_a1F9 }}} To my untrained eye, that looks pretty reasonable. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9540 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler