gpt4 book ai didi

haskell /GHC : {-# SPECIALIZE #-} Causes 'RULE left-hand side too complicated to desugar' Warning

转载 作者:行者123 更新时间:2023-12-02 20:36:58 26 4
gpt4 key购买 nike

我有一段代码,它使用 monad 来抽象实际的实现是在 ST 还是 IO 中运行。由于内联和缺少类型类函数调用开销,删除额外的抽象层并仅替换具体类型可带来巨大的加速(约 4.5 倍)。我正在考虑通过使用专门的编译指示来获得一些性能,但我从编译器收到了一个相当无意义的警告。我无法制作一个简单的复制案例,因为这个简单的示例似乎有效,而且我不知道是什么导致了我的实际程序的差异。

基本上,我的程序是这样做的:

{-# 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 的修复。可能有帮助。

关于 haskell /GHC : {-# SPECIALIZE #-} Causes 'RULE left-hand side too complicated to desugar' Warning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com