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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
Performance 将函数提升到顶层会导致编译时间增加三倍_Performance_Haskell_Ghc_Type Families - Fatal编程技术网

Performance 将函数提升到顶层会导致编译时间增加三倍

Performance 将函数提升到顶层会导致编译时间增加三倍,performance,haskell,ghc,type-families,Performance,Haskell,Ghc,Type Families,我在Windows上使用GHC 8.4.2。我的程序取决于库,版本: (库本身并不重要,但作为大量使用类型族的代码示例除外。) 在我的机器上编译此代码需要9秒。但是,当我试图将从phase1移动到phase2函数,使其脱离where子句并成为顶级函数时,编译时间会激增到~29秒 将函数提升到顶层会导致编译速度变慢,这有什么原因吗 编辑:作为另一个数据点,将函数移动到顶层,但使用-XPartialTypeSignatures如下: {-# LANGUAGE PartialTypeSignature

我在Windows上使用GHC 8.4.2。我的程序取决于库,版本:

(库本身并不重要,但作为大量使用类型族的代码示例除外。)

在我的机器上编译此代码需要9秒。但是,当我试图将
从phase1移动到phase2
函数,使其脱离
where
子句并成为顶级函数时,编译时间会激增到~29秒

将函数提升到顶层会导致编译速度变慢,这有什么原因吗

编辑:作为另一个数据点,将函数移动到顶层,但使用
-XPartialTypeSignatures
如下:

{-# LANGUAGE PartialTypeSignatures #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}

fromPhase1ToPhase2 :: Variant I _ -> Variant I _
fromPhase1ToPhase2 v = case winnowI @"ctor1" @Int @Phase01 v of 
    Right z -> injectI @"ctor2" False
    Left l -> l

保持原始编译时间~9秒

原始编译时间已经很糟糕了。我建议在GHC trac上打开票据,特别是因为这是一个非常小的独立示例。当您将
从Phase1移动到Phase2
到顶层时,您是否也将其签名放在顶层?对于像
Phase01
这样的大型类型级列表,类型推断(没有签名)比类型检查(有签名,甚至是部分签名)要困难得多。@AntC是的,大约29秒是顶级签名。打开GHC票据,似乎减速与示例模块的导出列表有关。如果我将
模块Main(Main)写入其中
而不是导出所有内容,则即使函数
从Phase1到Phase2
处于顶层,减速也会消失。
{-# LANGUAGE PartialTypeSignatures #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}

fromPhase1ToPhase2 :: Variant I _ -> Variant I _
fromPhase1ToPhase2 v = case winnowI @"ctor1" @Int @Phase01 v of 
    Right z -> injectI @"ctor2" False
    Left l -> l