Имеет ли неиспользованное связывание связывание какое-либо действие в Haskell?
Я только понял, что на самом деле законно писать это:
let _ = sum [1..100]
in "Hello"
Передача let-binding, кажется, ничего не делает.
Но теперь я задаюсь вопросом о точной семантике здесь. Можно написать программу, которая содержит привязку _
, и все же удаление этой привязки заметно изменит значение указанной программы?
В принципе, мне интересно, можно ли автоматически удалить такие привязки. Насколько я могу судить, значение этой привязки не может ни на что повлиять. Тем не менее, кажется гипотетически возможным, что этот тип может повлиять на что-то еще. Может ли кто-нибудь построить пример?
Ответы
Ответ 1
Вот один пример. При привязке _
вывод 8.0
, но без него это 8
. (По общему признанию, это не очень большая разница, но я уверен, что это можно было бы использовать в качестве основы для чего-то более существенного.)
main :: IO ()
main = let x = 5
_ = asTypeOf x 6.0
in print $ x + 3
Ответ 2
Я думаю, что в этом примере x
имеет тип Num a => [a]
, но без второй строки это будет (Num a, Monad m) => m a
. Однако у вас нет GHCi на этом компьютере, чтобы проверить его дважды.
let x = return 3
_ = sum x
in x
Ответ 3
Патологический пример, но я думаю, что он квалифицирует ваше требование
Можно написать программу, которая содержит привязку _, и при этом удаление этой привязки заметно изменит значение указанной программы?
который компилятор отклоняет, если вы не удалите эту строку:
main =
let _ = void main() { fprintf STDERR "I'm a confused C programmer" }
in print "I'm not"