Подтвердить что ты не робот

Имеет ли неиспользованное связывание связывание какое-либо действие в Haskell?

Я только понял, что на самом деле законно писать это:

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

Передача let-binding, кажется, ничего не делает.

Но теперь я задаюсь вопросом о точной семантике здесь. Можно написать программу, которая содержит привязку _, и все же удаление этой привязки заметно изменит значение указанной программы?

В принципе, мне интересно, можно ли автоматически удалить такие привязки. Насколько я могу судить, значение этой привязки не может ни на что повлиять. Тем не менее, кажется гипотетически возможным, что этот тип может повлиять на что-то еще. Может ли кто-нибудь построить пример?

4b9b3361

Ответ 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"