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
Performance 为什么使Vector成为函子、单子、应用程序、可选、可折叠和可遍历的实例的函数速度慢?_Performance_Haskell - Fatal编程技术网

Performance 为什么使Vector成为函子、单子、应用程序、可选、可折叠和可遍历的实例的函数速度慢?

Performance 为什么使Vector成为函子、单子、应用程序、可选、可折叠和可遍历的实例的函数速度慢?,performance,haskell,Performance,Haskell,的版本0.8的更改日志列出了以下更改,并带有警告: 函子,单子,可应用,可选,可折叠和可遍历 装箱向量的实例(警告:它们往往比较慢,并且 仅为完整性提供) 有人能解释一下为什么会这样吗?这只是类型类专门化的正常成本,还是更有趣的东西 更新:查看一些特定实例,例如: instance Foldable.Foldable Vector where {-# INLINE foldr #-} foldr = foldr 其他褶皱也是如此。这是否意味着一般情况下,Vectors的折叠速度慢?如果

的版本0.8的更改日志列出了以下更改,并带有警告:

函子,单子,可应用,可选,可折叠和可遍历 装箱向量的实例(警告:它们往往比较慢,并且 仅为完整性提供)

有人能解释一下为什么会这样吗?这只是类型类专门化的正常成本,还是更有趣的东西

更新:查看一些特定实例,例如:

instance Foldable.Foldable Vector where
  {-# INLINE foldr #-}
  foldr = foldr

其他褶皱也是如此。这是否意味着一般情况下,
Vector
s的折叠速度慢?如果不是,是什么让非专业化折叠速度慢到足以发出警告?

我刚刚快速查看了源代码,实现看起来不会太慢。我认为作者添加了这个警告是因为当你在
向量
单子中编写程序时,你是从这样一个高层次的角度工作的,以至于很容易忘记每个
>=
实际上都是一个
concatMap
,它天生就很慢


另一件事:
Vector
对于未装箱类型特别快。因此,用户可能会被吸引来使用monad符号(为了方便),而实际上他应该使用一种非固定类型(为了速度)。

一年半前,我向Roman提交了这些实例的原始集合,并从那时起维护了向量实例。(一旦这些实例迁移到vector中,我就必须从vector实例中删除它们,现在只为真正奇特的东西维护它们)。他担心的是,如果人们以多态方式使用这些实例,那么,除非多态函数内联并单形化,否则无法触发使向量融合的规则

它们之所以存在,是因为地球上并非每一个代码都是特定于向量的,即使如此,有时也可以使用通用名称


这里的慢是相对的。最糟糕的情况是,它们的表现与其他任何人的折叠、捆绑等一样。但罗曼认为每一个装箱价值都是对个人的侮辱。:)

这是一个有趣的想法。不过,在接受答案之前,我会等一会儿,以防出现一个不那么投机的答案。(哦,当我这么说的时候,我并不想说是否定的……我想这个问题本身就有点推测性——《向量》的作者在写警告的时候是什么意思?)。没问题,在这种情况下我也会这么做——我的答案只是一个有根据的猜测。