Haskell/GHC: {- # СПЕЦИАЛИЗИРОВАТЬ # -} Вызывает слишком сильную левую часть RULE для десурага. Предупреждение

У меня есть код кода, который использует монаду для абстрактного, реализуется ли фактическая реализация внутри ST или IO. Удаление дополнительного слоя абстракции и просто замена бетонных типов дает огромное ускорение (~ 4.5x) из-за накладных и отсутствующих служебных вызовов функции функциональности. Я думал о том, чтобы получить некоторые из этих результатов, используя специальную прагму, но я получаю довольно бессмысленное предупреждение от компилятора. Я не могу сделать простой случай воспроизведения, так как простой пример, похоже, работает, и я не знаю, что вызывает разницу в моей реальной программе.

В принципе, моя программа делает это:

{-# LANGUAGE FlexibleInstances, RankNTypes #-}

module STImpl (runAbstractST, MonadAbstractIOST(..), ReaderST) where

import Control.Monad.Reader
import Control.Monad.ST

class Monad m => MonadAbstractIOST m where
    addstuff :: Int -> m Int

type ReaderST s = ReaderT (Int) (ST s)

instance MonadAbstractIOST (ReaderST s) where
    addstuff a = return . (a +) =<< ask

runAbstractST :: (forall s. ReaderST s a) -> a
runAbstractST f = runST $ runReaderT f 99

и

module Main (main) where

import STImpl

import Control.Monad

{-# SPECIALIZE INLINE useAbstractMonad :: ReaderST s Int #-}
useAbstractMonad :: MonadAbstractIOST m => m Int
useAbstractMonad = foldM (\a b -> a `seq` return . (a +) =<< (addstuff b)) 0 [1..50000000]

main :: IO ()
main = do
    let st = runAbstractST useAbstractMonad
    putStrLn . show $ st

Теперь все выглядит нормально. Но в моей программе я получаю

RULE left-hand side too complicated to desugar
  let {
    $dFunctor :: Functor (RSTSim s)
    [LclId]
    $dFunctor =
      Control.Monad.Trans.Reader.$fFunctorReaderT
        @ (MonadSim.SimState s)
        @ (GHC.ST.ST s)
        (GHC.ST.$fFunctorST @ s) } in
  simulate
    @ (Control.Monad.Trans.Reader.ReaderT
         (MonadSim.SimState s) (GHC.ST.ST s))
    (MonadSim.$fMonadSimReaderT
       @ s
       $dFunctor
       (Control.Monad.Trans.Reader.$fMonadReaderT
          @ (MonadSim.SimState s)
          @ (GHC.ST.ST s)
          (GHC.ST.$fMonadST @ s))
       (Control.Monad.Trans.Reader.$fApplicativeReaderT
          @ (MonadSim.SimState s)
          @ (GHC.ST.ST s)
          $dFunctor
          (Control.Applicative.$fApplicativeST0
             @ s (GHC.ST.$fFunctorST @ s))))

Я не понимаю, что означает "левая сторона", "слишком сложная" и "десузар"; -)

Кажется, у меня такая же проблема, как описано здесь: http://marc.info/?l=haskell-cafe&m=133242702914511

Как мне это диагностировать? Как определить, что приводит к отключению оптимизации в моей программе?

Спасибо!

Ответ 1

Для чего это стоит, на 7.10 RC1 эта ошибка больше не возникает, поэтому похоже, что исправление https://ghc.haskell.org/trac/ghc/ticket/8848, возможно, помогло.