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

ank*_*sns 2 haskell let

我正在写一个与此类似的函数:

f x = let
  x = ...
  in
    e
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cha*_*ert 10

您可以使用编译器标志为此类型的名称阴影启用警告

-fwarn-name-shadowing

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

但是,编译时更常见-Wall,其中包括许多其他警告,可以帮助您避免不良做法.

  • 很公平.但我经常对那些设法文件和规范的人们感到震惊,他们设法解释导致阴影等决策的推理线,所以我认为这样的答案是有效的而不是意见问题.在任何一种情况下 - 我认为乍得为如何处理它的实际问题提供了答案. (3认同)
  • @LudvigH,Haskell几乎可以肯定地允许它,因为它允许在lambda演算和导致Haskell的LC后代链中.LC本身旨在作为一种正式的逻辑系统,而不是一种编程语言; Alonzo Church可能甚至没有考虑到人为错误的可能性. (3认同)