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

Mat*_*hid 13 syntax haskell

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

let _ = sum [1..100]
in  "Hello"
Run Code Online (Sandbox Code Playgroud)

let-binding似乎绝对没有任何作用.

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

基本上,我想知道自动删除这样的绑定是否安全.据我所知,这种绑定的价值不可能影响任何事情.然而,似乎假设它的类型可能会影响其他东西.任何人都可以构建一个例子吗?

jwo*_*der 18

这是一个例子.通过_绑定,输出是8.0,但没有它,它是8.(不可否认,这不是一个很大的区别,但我相信这可以作为更实质性的基础.)

main :: IO ()
main = let x = 5
           _ = asTypeOf x 6.0
       in print $ x + 3
Run Code Online (Sandbox Code Playgroud)

  • @chi这是因为局部绑定是单形的,除非明确地变成多态.为`x`添加类型签名会使其显式多态,因此它独立于`print`行中的其他绑定而默认. (2认同)
  • 通过解释发生这种情况的原因,可以大大改善这个答案 虽然这绝对是一个很好的发现! (2认同)

Dou*_*ean 10

我认为在这个例子中x有类型Num a => [a],但没有第二行它会(Num a, Monad m) => m a.但是,请不要在此计算机上进行GHCi检查.

let x = return 3
    _ = sum x
 in x
Run Code Online (Sandbox Code Playgroud)