Haskell中的名称捕获`let`表达式

时间:2017-08-24 11:42:37

标签: haskell let

我正在编写类似于此的函数:

f x = let
  x = ...
  in
    e

由于Haskell中的作用域规则,在e中使用x将解析let构造中x的定义。

为什么在Haskell中允许这样的事情? 不应该让编译器拒绝这样一个程序,告诉我们不能绑定一个与函数参数同名的值。

(这个例子可能过于简单,但在现实世界中,变量具有与之相关的语义含义,很容易犯这样的错误)

1 个答案:

答案 0 :(得分:9)

您可以使用编译器标志

为此类型的名称阴影启用警告

-fwarn-name-shadowing

  

只要内部范围值与外部范围值具有相同的名称(即内部值隐藏外部值),此选项就会发出警告。这可以捕获印刷错误,这些错误会变成难以发现的错误,例如,无意中捕获f = ...中的f = id中的递归调用....

但是,使用-Wall进行编译更为常见,其中包含许多其他警告,可以帮助您避免不良做法。