我刚才意识到写这个是合法的:
let _ = sum [1..100]
in "Hello"
let-binding似乎绝对没有。
但现在我对这里的确切语义感到疑惑。可以编写一个包含_
绑定的程序,但删除该绑定会明显改变所述程序的含义吗?
基本上,我想知道自动删除此类绑定是否安全。据我所知,此绑定的值不可能影响任何事情。但是,似乎假设其类型可能会影响其他内容。任何人都可以构建一个例子吗?
答案 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"