Haskell类型推断编译速度

Haskell类型推断编译速度,haskell,Haskell,在Haskell中不显式声明类型对编译速度的影响有多大 例如: f x y = x + y -- versus f :: Int -> Int -> Int f x y = x + y 编辑:我的问题的措辞似乎听起来像是在问删除这些类型是否会加快速度。我的意思是如果它使它变慢。这是因为编译器现在必须确定在没有开发人员帮助的情况下将使用什么类型。如果必须推断类型,编译器会花费更长的时间吗是。 你能很容易地说出延迟的大小吗不,但它肯定不小 推理机非常复杂,很少有人接触它。你能问这个

在Haskell中不显式声明类型对编译速度的影响有多大

例如:

f x y = x + y

-- versus

f :: Int -> Int -> Int
f x y = x + y

编辑:我的问题的措辞似乎听起来像是在问删除这些类型是否会加快速度。我的意思是如果它使它变慢。这是因为编译器现在必须确定在没有开发人员帮助的情况下将使用什么类型。

如果必须推断类型,编译器会花费更长的时间吗是。

你能很容易地说出延迟的大小吗,但它肯定不小


推理机非常复杂,很少有人接触它。你能问这个问题的最佳人选是西蒙·佩顿·琼斯博士。

如评论中所述,添加类型签名不允许编译器跳过类型检查;它仍然会检查您的类型签名是否与代码匹配

删除类型签名也不会关闭类型检查;编译器仍将检查代码的类型错误

所以,实际上,是否编写类型签名通常对编译时间几乎没有任何影响。(它可能会对运行时性能产生显著影响,但通常根本不会影响编译时间。)

不管怎样,类型检查通常是编译时间中可以忽略的一部分;通常,解析、加载模块接口和链接需要更长的时间


(当然,有些人对类型系统做了非常疯狂的事情,这可能会使编译速度大大降低。但对于Haskell初学者来说,这不太重要。)

类型注释的存在并不意味着编译器将跳过类型检查。它仍然会进行类型检查,检查你的注释是否与结果相矛盾。你可以构建可怕的案例,但我从未听说过现实世界中存在明显差异的情况。这可能是因为您所做的大多数工作都会有“非常接近”的签名,例如前奏曲功能,或者需要签名来消除歧义。还请注意,有时您需要签名在场,例如,在处理秩-2类型的工作时。这是一种广义的回答,而不是说“它会影响它很多,或者根本不会”。我见过部分类型签名比没有类型签名更糟糕的情况。我也看到过没有类型签名比部分或完整类型签名更糟糕的情况。这实际上取决于类型。我认为速度差异的主要原因是,如果您编写的类型签名与GHC推断的不同(或多或少是通用的),那么可能需要不同的时间来检查该类型的其他用途(因为它不同)。对于编写签名的绑定,它仍然需要确定您的类型是否与代码一致,这通常涉及到与使用或不使用签名编译时所做的分析相同的分析。这并不是说省略签名会给编译器留下“更多的工作”。在其他情况下,如果必须检查类型签名,则可能需要更长的时间。在实践中,类型推断通常非常迅速。