未使用的let绑定在Haskell中有任何影响吗?

未使用的let绑定在Haskell中有任何影响吗?,haskell,syntax,Haskell,Syntax,我刚刚意识到写这篇文章实际上是合法的: let _ = sum [1..100] in "Hello" let绑定似乎完全不起任何作用 但现在我想知道这里的确切语义。可以编写一个包含绑定的程序,但是删除该绑定会明显改变所述程序的含义吗 基本上,我想知道自动删除这样的绑定是否安全。就我所知,这个绑定的值不可能影响任何东西。然而,从假设的角度来看,它的类型可能会影响其他东西。有人能构造一个例子吗?我认为在这个例子中,x的类型是numa=>[a],但如果没有第二行,它将是(numa,Monad m

我刚刚意识到写这篇文章实际上是合法的:

let _ = sum [1..100]
in  "Hello"
let绑定似乎完全不起任何作用

但现在我想知道这里的确切语义。可以编写一个包含
绑定的程序,但是删除该绑定会明显改变所述程序的含义吗


基本上,我想知道自动删除这样的绑定是否安全。就我所知,这个绑定的值不可能影响任何东西。然而,从假设的角度来看,它的类型可能会影响其他东西。有人能构造一个例子吗?

我认为在这个例子中,
x
的类型是
numa=>[a]
,但如果没有第二行,它将是
(numa,Monad m)=>ma
。不过,这台计算机上没有GHCi进行双重检查

let x = return 3
    _ = sum x
 in x

这里有一个例子。使用
\uuu
绑定时,输出为
8.0
,但如果没有它,则输出为
8
。(无可否认,这并不是一个很大的区别,但我相信这可以作为更实质性的东西的基础。)


一个病态的例子,但我认为它符合你的要求

可以编写一个包含uu绑定的程序,但删除该绑定会明显改变所述程序的含义

除非删除该行,否则编译器将拒绝该行:

main = 
  let _ = void main() { fprintf STDERR "I'm a confused C programmer" }
  in print "I'm not"

很好的发现。这里,默认机制将
x
设置为整数,“除非有其他原因”。从实用的角度来看,这可能很方便。从理论上看,这是一个“特例”,使得语义比需要的更复杂。禁用单态限制并没有改变这种行为。我认为这足以使
x
多态,本质上使
astypeofx6.0
的编译时不起作用,但我错了。添加
x::Num a=>a
会使它成为一个no-op,这让我感到困惑。@chi这是因为除非显式地使其多态,否则局部绑定是单态的。为
x
添加类型签名会使其显式多态,这样它就可以独立于
print
行中的其他绑定进行默认设置。@Carl啊!我没有意识到局部结合对于单态的处理是不同的。我猜
NoMonomorphismRestriction
只适用于顶级绑定。通过解释为什么会发生这种情况,这个答案可以得到极大的改进。虽然这绝对是一个好发现
x
具有类型
Num a=>[a]
,因为
sum::Num a=>[a]->a
。这一点很好。我忘了3可以是任意数值,而不仅仅是整数。编辑。
输入“你好”
也是有效的。天哪。。。我确信这是不允许的。但它符合哈斯克尔计划的条件吗?除息的
main = 
  let _ = void main() { fprintf STDERR "I'm a confused C programmer" }
  in print "I'm not"