Jak*_*son 6 haskell declaration function function-declaration
关于 Haskell 我不完全理解的一件事是声明函数及其类型:这是您必须做的事情还是只是为了清晰起见而应该做的事情?还是在某些情况下您需要这样做,而不是全部?
您不需要声明任何仅使用标准 Haskell 类型系统功能的函数的类型。Haskell 98 指定了全局类型推断,这意味着所有顶级绑定的类型都保证是可推断的。
\n然而,出于以下几个原因,在顶级定义中包含类型注释是一种很好的做法:
\n验证推断的类型是否符合您的期望
\n当存在类型不匹配时帮助编译器生成更好的诊断消息
\n最重要的是,记录您的意图并使代码对人类来说更具可读性!
\n至于where子句中的定义,这是一个风格问题。传统的风格是省略它们,部分原因是在某些情况下,它们的类型无法在扩展之前显式编写ScopedTypeVariables。我认为 1998 年和 2010 年标准中省略作用域类型变量是一个 bug,GHC 是当今事实上的标准编译器,但它\xe2\x80\x99s 仍然是一个非标准扩展。无论如何,在可能的情况下为重要代码添加注释是一个很好的做法,并且对程序员很有帮助。
在实践中,\xe2\x80\x99 通常使用一些使类型推断复杂化或使其 \xe2\x80\x9 不可判定\xe2\x80\x9d 的语言扩展,这意味着,至少对于任意程序,它\xe2\x80 \x99s 不可能总是推断出类型,或者至少推断出唯一的 \xe2\x80\x9cbest\xe2\x80\x9d 类型。但为了可用性,扩展通常经过精心设计,仅在实际使用它们时才需要注释。
\n例如,GHC(和标准 Haskell)只会推断具有顶级的 forall多态类型,这通常是完全隐式的。(它们可以使用 显式编写ExplicitForAll。)如果您需要将多态函数作为参数传递给另一个函数(如(forall t. \xe2\x80\xa6) -> \xe2\x80\xa6using RankNTypes),则需要一个注释来覆盖编译器\xe2\x80\x99s 假设您的意思是类似forall t. (\xe2\x80\xa6 -> \xe2\x80\xa6),或者您错误地将函数应用到不同的类型上。
如果扩展需要注释,则必须在何时何地包含它们的规则通常记录在 GHC User\xe2\x80\x99s Guide 等地方,并在指定该功能的论文中正式指定。
\n| 归档时间: |
|
| 查看次数: |
1163 次 |
| 最近记录: |