'导致'规则离开
我有一个使用monad来抽象实际实现是在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
我如何诊断? 如何找出导致优化在我的程序中被禁用的原因?
谢谢!
对于它的价值,在7.10 RC1上这个错误不再发生,所以看起来像https://ghc.haskell.org/trac/ghc/ticket/8848的修复可能有帮助。
链接地址: http://www.djcxy.com/p/33187.html上一篇: } Causes 'RULE left