Haskell / GHC:{-# SPECIALIZE #-} 导致“规则左侧过于复杂,无法脱糖”警告

2024-01-12

我有一段代码,它使用 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

and

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))))

我不明白“左侧”、“太复杂”和“脱糖”是什么意思;-)

我似乎遇到了与这里描述的相同的问题:

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

Thanks!


就其价值而言,在 7.10 RC1 上,此错误不再发生,因此看起来像是修复https://ghc.haskell.org/trac/ghc/ticket/8848 https://ghc.haskell.org/trac/ghc/ticket/8848可能有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell / GHC:{-# SPECIALIZE #-} 导致“规则左侧过于复杂,无法脱糖”警告 的相关文章

  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • 如何为强制长度为 2^n 的向量类型定义可用的 Applicative 实例

    对于某些应用程序 我需要长度为 2 n 的向量 为了强制某些操作的长度匹配 我使用 ist 应用实例定义了我的类型 如下所示 LANGUAGE GADTs DataKinds FlexibleInstances FlexibleContex
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做

随机推荐

  • angular2 组件中的多个动画触发器

    我想在一个组件中定义多个动画触发器 这可能吗 例如 一种用于进入场景 另一种用于悬停 或者我是否需要为这种情况定义两个组件 父子组件 项目组件 ts removed the import and class part for better
  • Javascript / REGEX:删除字符串中以特定字母开头的特定文本(单词),单词之间以空格分隔

    我知道这可以通过正则表达式快速完成 我得到的字符串如下 Alpha OmegaS Sheol Gehena GSSaga Serekali 我想删除以 s 开头的单词 所以我应该 Alpha OmegaS Gehena GSSaga 我尝试
  • ThreadStateException:尝试加入线程时线程尚未启动

    就在最近我面试的时候遇到了这样一个问题 methid 计算 执行的输出是什么 public void Calculate var threads Enumerable Range 0 50 Select x gt var thread ne
  • DataGridView 鼠标滚轮滚动停止工作

    我的应用程序中有一个 DataGridView 但无法使用鼠标滚轮滚动它 以前运行得很好 我不确定我做了什么导致了这个问题 因为我最近对代码进行了多次更改后才注意到它 我没有发布任何代码 因为有超过 2k 行 而且我不确定错误可能出在哪里
  • 如何阻止网站注册表中的一次性电子邮件地址? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想知道可能的阻止方法一次性电子邮件地址 http en wikipedia org wiki Dis
  • 是否可以对包含 url 编码的 url 进行 urlencode?

    我有一个网站 使用 Facebook Twitter 美味分享链接 它们包含您希望共享的网站的 url 编码 url 问题是我想通过 php 重定向页面发送 facebook twitter delicious url 在编码的 url 中
  • 在 VBA 中导入 UTF-8 文件

    我想在表中导入一个管道分隔文件 但该文件采用 UTF 8 格式 具有动态结构 我曾尝试使用 TransfertText 和 FSO 但只有 ADODB Stream 似乎可以很好地处理这种编码 但它只读取全文 如何每行读取这样的文件行以在现
  • 具有抽象方法的接口

    我遇到了一些由同事编写的 PHP 代码 它没有用于任何用途 基本上它是一个包含抽象方法的接口 然后我说这很愚蠢 并展示了坐在我旁边的另一位同事 我们笑了 但随后开始互相询问这是否可能 如果可能的话是否真的有用 显然这是不可能的 参见下面的示
  • module-info.java 不适用于 Java 9 中的 lombok

    我在将项目迁移到Java 9 更新 Java 9 后 我尝试运行项目 但遇到编译器错误 Error 6 1 java package javax annotation is not visible package javax annotat
  • 在 Windows 8 上安装 Docker 卷不起作用

    Context 我想在 Windows 8 上运行 Docker Compose 应用程序 我在 Ubuntu 16 04 下制作了它 它运行得很好 此 Docker Compose 运行 nginx php fpm 这两个容器使用卷 Fi
  • Git 预提交钩子配置

    我正在关注办公室指导 https pre commit com创建钩子并将其添加到预提交检查过程 我需要创建 3 个文件 pre commit config yaml pre commit hooks yaml theCheckFile s
  • ioexception:在java中写入文件时客户端不拥有所需的权限

    我搜索了很多类似的问题 但无法解决我的问题 我试图在文件中写入一些内容 这给了我错误 My code try File f new File file name f createNewFile System out println Hell
  • 无法使用 Sigma.js 显示任何图表

    我想在网络界面上可视化大型网络图 经过几天的搜索 我决定使用 Sigma js 因为它看起来很简单并且兼容 HTML5 问题是我无法显示 Sigma js 网页上的任何图形示例 即使我使用作者在 Sigma js 主页上拥有的最少代码也是如
  • write 和 printf 哪个更快?

    进行以下测试后 for i 0 i lt 3000000 i printf Test string n for i 0 i lt 3000000 i write STDOUT FILENO Test string n strlen Test
  • 如何创建带空格的列名?

    谁能告诉我如何创建带有 全名 这样的空格的列 我已经尝试过类似以下的操作 但它不起作用 CREATE TABLE info Full Names varchar 20 Physical Address varchar 20 Moviesre
  • GCMIntentService 的 onRegistered() 从未调用过

    我正在尝试在 GCM 上注册我的应用程序 但我不知道为什么我的应用程序从未注册 GCMRegistrar register this SENDER ID 被调用 但我的 GCMIntentService 中的 onRegistered 从未
  • R 中的滚动连接 data.table

    我试图更多地了解滚动连接的工作方式 但有些困惑 我希望有人能为我澄清这一点 举一个具体的例子 dt1 lt data table id rep 1 5 10 t 1 50 val1 1 50 key id t dt2 lt data tab
  • 如何使用 PHP 制作 cookie [重复]

    这个问题在这里已经有答案了 可能的重复 如何为uuid设置cookie https stackoverflow com questions 5750658 how to set cookies for uuid 你好 我想知道如何用PHP制
  • 如何在 Flask 中将数据写入文本文件? [复制]

    这个问题在这里已经有答案了 我们的目标是将名为 inputed email 的变量写入名为 test3 txt 的文本文件中 因为这是在服务器上进行的 所以我们需要确保该 Python 脚本可以访问该目录和文本文件 app route me
  • Haskell / GHC:{-# SPECIALIZE #-} 导致“规则左侧过于复杂,无法脱糖”警告

    我有一段代码 它使用 monad 来抽象实际实现是在 ST 还是 IO 中运行 由于内联和缺少类型类函数调用开销 删除额外的抽象层并仅替换具体类型会带来巨大的加速 约 4 5 倍 我正在考虑通过使用专门的编译指示来获得一些性能 但我从编译器