Haskell/GHC:{ - #SPECIALIZE# - }导致'RULE左手边太复杂到desugar'警告

NBF*_*RTW 7 haskell pragma ghc

我有一个代码体,使用monad来抽象实际实现是在ST还是IO内运行.由于内联和缺少类型类函数调用开销,删除额外的抽象层并且只是替换具体类型会产生巨大的加速(~4.5x).我想通过使用specialize pragma来获得一些性能,但是我从编译器得到了一个相当无意义的警告.我不能做一个简单的复制案例,因为这个简单的例子似乎有用,而且我不知道是什么导致我的实际程序有所不同.

基本上,我的程序执行此操作:

{-# 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在,这里的一切似乎都很好.但在我的计划中,我得到了

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))))
Run Code Online (Sandbox Code Playgroud)

我不明白'左手边','太复杂'和'desugar'的意思;-)

看来我遇到的问题与此处描述的相同:http://marc.info/? l = haskell-cafe&m = 133242702914511

我该如何诊断?如何找出导致我的程序中的优化被禁用的原因?

谢谢!

Edw*_*ang 1

无论如何,在 7.10 RC1 上,此错误不再发生,因此看起来https://ghc.haskell.org/trac/ghc/ticket/8848的修复可能有所帮助。