Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用'deriving'关键字分析GHC生成的函数_Haskell_Profiling_Ghc - Fatal编程技术网

Haskell 使用'deriving'关键字分析GHC生成的函数

Haskell 使用'deriving'关键字分析GHC生成的函数,haskell,profiling,ghc,Haskell,Profiling,Ghc,我正在尝试优化Haskell程序。在profiler输出中,我看到在compare和==函数中花费了大量时间。但是,GHC分析器只告诉我这些函数的模块名。我猜这些是GHC通过推导Eq和Ord生成的函数。我想知道是否有一种简单的方法来确定实际问题在哪里。例如,使用 {-SCC-more-specific name-}用于这些函数。用于转储GHC生成的实际派生实例的代码,然后获取代码并将其放在自己明确定义的函数下。然后显式派生实例并将它们指向函数。compare和==已经是最具体的名称。它们是Ord

我正在尝试优化Haskell程序。在profiler输出中,我看到在compare和==函数中花费了大量时间。但是,GHC分析器只告诉我这些函数的模块名。我猜这些是GHC通过推导Eq和Ord生成的函数。我想知道是否有一种简单的方法来确定实际问题在哪里。例如,使用
{-SCC-more-specific name-}用于这些函数。

用于转储GHC生成的实际派生实例的代码,然后获取代码并将其放在自己明确定义的函数下。然后显式派生实例并将它们指向函数。

compare和==已经是最具体的名称。它们是Ord类中方法的名称。派生子句是一个实例声明,您在其中定义了与类的实例关联的字典。如果您想从代码中删除重载,那么您可能只需要从代码中删除多态性,或者在编译器中使用一些PRAGMA。我不想删除重载。我只想知道==是用于类型A还是类型B。对于手写实例,这很容易做到:为每个实例的实现设置不同的名称。但是,由于Eq的实现对我来说是隐藏的,除非我自己实现它,而不是使用派生关键字,所以我不能使用SCC pragma。顺便说一句,我猜compare和==不是最具体的名称。它们可能类似于A.compare或==of B。我没有使用它,它看起来需要模板Haskell,但可以为派生实例吐出代码,尽管可能与GHC生成的代码不同。有一个3年的开放版本,唉,它似乎没有受到多少关注。这听起来是一个合理的解决方案,但是我在输出中得到了一些奇怪的字段名,比如g2_ag0CR和b_aidSP。优化也可以用-O0关闭,但它没有帮助。这些是GHC生成的唯一名称。它们是在那里创建的,只在那里使用,所以你可以手动将它们重命名为你想要的任何东西,比如mytype_compare或mytype_eq。好吧,这种方法似乎不是那么直接。我不得不手动修复很多东西,但我无法解决这个问题:有一些调用$con2tag\u Foo函数,我在转储中找不到该函数的定义。你知道吗?谷歌搜索con2tag_Foo ghc找到了我。con2tag_Foo::Foo…->Int似乎是一个用于转换Foo类型值的函数。。。对于构造函数的Int标记,从0开始编号,是或是,文件似乎没有头版本?用于生成各种类的更高效实例。$con2tag看起来像是一种深刻的内部GHC魔法。我认为它代表了与数据类型一起创建的不可访问的ghc内部函数。