Что, в Haskell, делает знак подчеркивания, предшествующий переменной?

Mark Neu спросил: 12 мая 2018 в 03:45 в: haskell

Я просматривал источник Data.Foldable, где я пришел через Endo #. f, и после нажатия этой ссылки столкнулся с:

(#.) _f = coerce

Теперь , во-первых, я не знаю, что coerce и ранее упомянутый Coercible, тем не менее, это меня больше сбивает с толку, что может означать _f. Я искал "Haskell underscore before variable" и аналогичный и только нашел обсуждения о синтаксисе соответствия шаблону _.

2 ответа

Есть решение
Daniel Wagner ответил: 12 мая 2018 в 03:59

Согласно спецификации Haskell, это просто другое возможное имя переменной. Но правда немного больше, потому что большинство разработчиков Haskell пишут код специально для GHC, и это один из тех случаев.

GHC имеет множество полезных предупреждений; один должен предупредить вас, когда вы пишете шаблон, который связывает переменную, которая не используется в теле функции. Это очень удобно, и я поймал пару ошибок. Тем не менее, он имеет эффект детонации: если вы пишете функцию, которая использует некоторые из переменных только в одном или другом, вы получаете предупреждение. Например, вот очень естественное определение foldr в списках:

 foldr f z [] = z
 foldr f z (x:xs) = x `f` foldr f z xs

Упс! Мы не использовали f в первом предложении, и мы получим предупреждение. Хорошо, поэтому достаточно легко исправить:

foldr _ z [] = z
foldr f z (x:xs) = x `f` foldr f z xs

К сожалению, теперь мы потеряли информацию о том, какова роль этой первой переменной в коде. В этом случае foldr настолько знаком, что это не большая потеря, но в незнакомых кодовых базах с функциями, которые принимают много аргументов, может быть приятно знать, какие данные игнорируются каждой "дырой". Поэтому GHC добавляет специальное правило: предупреждение о неиспользуемых переменных не предупреждает вас об именах переменных, которые начинаются с _ - по аналогии с шаблоном _, который также не предупреждаю вас. Итак, теперь я могу написать:

foldr _f z [] = z
foldr  f z (x:xs) = x `f` foldr f z xs

Теперь я получаю лучшее из обоих миров: я получаю хорошее предупреждение, если забываю использовать переменную, связанную мной, и я все еще могу дать читайте информацию о значении отверстий в шаблонах, которые мне не нужны для текущего предложения. (В качестве примечания я хотел бы получить дополнительное предупреждение о том, что если я do ошибочно использует переменную, начинающуюся с _, но я не думаю, что она существует в данный момент Это звучит глупо ("просто не набирайте _ в теле функции"), но я обнаружил, что вкладка моего редактора иногда вставляла их для меня, и было бы легко не заметить, вы быстро кодировали.)

Sebastian Redl ответил: 12 мая 2018 в 03:48

Это просто соглашение о пометке неиспользуемой переменной. Как вы видите, _f не используется в определении #., поэтому он отмечен знаком подчеркивания.

Thomas M. DuBuisson ответил: 12 мая 2018 в 03:50
Это немного больше, чем человеческая конвенция, хотя GHC не будет давать неиспользованные переменные предупреждения для переменных с префиксом-префиксом.