Ответ 1
Да. В разделе раздела 2.4 спецификации 2010 года говорится:
Подчеркивание,
_
, рассматривается как строчная буква и может происходить везде, где может быть строчная буква.
... поэтому _threadId
является юридическим идентификатором в соответствии с спецификацией языка, которая должна быть полностью переносимой.
Однако
_
сам по себе является зарезервированным идентификатором, который используется в качестве шаблона в виде wild card.
... поэтому вы не можете использовать внешние шаблоны _
, поэтому не можете использовать это значение.
Составителям, которые предлагают предупреждения для неиспользуемых идентификаторов, рекомендуется подавлять такие предупреждения для идентификаторов, начинающихся с подчеркивания. Это позволяет программистам использовать
_foo
для параметра, который, как они ожидают, не используется.
Итак, _threadId
- это обычный идентификатор, который вы можете использовать в другом месте, но не следует предупреждать, если его выбросить.
(Точно такой же текст содержится в отчете Haskell 98.)
Примеры:
main = do
_two <- return 2
print _two -- works
компилирует и печатает 2 в соответствии со спецификацией и
main = do
_two <- return 2
print 3 -- no warnings, but oops, didn't use _two
компилируется без предупреждения в соответствии со спецификацией и
main = do
_ <- return 2
print _ -- syntax error: _ used as identifier
является синтаксической ошибкой в соответствии со спецификацией.