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

时间:2014-07-27 19:18:44

标签: haskell syntax

我刚才意识到写这个是合法的:

let _ = sum [1..100]
in  "Hello"

let-binding似乎绝对没有

但现在我对这里的确切语义感到疑惑。可以编写一个包含_绑定的程序,但删除该绑定会明显改变所述程序的含义吗?

基本上,我想知道自动删除此类绑定是否安全。据我所知,此绑定的不可能影响任何事情。但是,似乎假设其类型可能会影响其他内容。任何人都可以构建一个例子吗?

3 个答案:

答案 0 :(得分:18)

这是一个例子。使用_绑定时,输出为8.0,但如果没有,则为8。 (不可否认,这不是一个非常大的区别,但我确信这可以作为更实质性的基础。)

main :: IO ()
main = let x = 5
           _ = asTypeOf x 6.0
       in print $ x + 3

答案 1 :(得分:10)

我认为在此示例中,x的类型为Num a => [a],但如果没有第二行,则为(Num a, Monad m) => m a。但是,请不要在这台电脑上进行GHCi仔细检查。

let x = return 3
    _ = sum x
 in x

答案 2 :(得分:1)

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

  

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

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

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