как иметь несколько одноразовых аргументов

#haskell #idioms

#haskell #идиомы

Вопрос:

Я знаю, что обычно используются такие функции, как

 f _ [] = Nothing
f a (x:xs) = ...
  

в Haskell кажется идиоматичным, что _ это одноразовое имя параметра.

Что, если у меня есть множество, о которых я не забочусь? Например.

 g _ _ [] _     = Nothing
g a _ (x:xs) b = ...
  

это то, что я хотел бы написать, но я не думаю, что у меня может быть несколько _ в одном определении.

Итак, что мне делать, когда многие из них меня не волнуют?

Комментарии:

1. Что произошло, когда вы попытались использовать несколько символов подчеркивания?

2. @MarcTalbot Я не знал, что _ что-то особенное в Haskell, я предполагал, что, как и в других языках программирования, _ это просто еще один допустимый идентификатор. Я не пробовал использовать несколько подчеркиваний, прежде чем задавать вопрос, вероятно, мне это не приходило в голову, или я посчитал это пустой тратой времени, потому что «это все равно привело бы к ошибке», или я испугался, что даже в случае успешного запуска я где-то что-то напортачил (представьте, что это клонировало первый аргумент или что-то в этом роде). Мне было удобнее спрашивать первым, извините.

3. тебе не за что извиняться. 🙁 зацени wiki.haskell.org/Keywords#.5C (запись для _ находится следующей под ней).

4.@theonlygusti Даже в языках, где _ это просто другой идентификатор, проблем нет (или может быть). Вы можете писать _, _, y, _ = ("w", "x", "y", "z") , например, на Python.

5. @chepner Я подозреваю, что Хаскелл пожаловался бы, если бы я это сделал f :: Int -> Bool -> String -> Int и тогда f a a v a = ... . И аналогично, аналог Haskell присваивания Python с разложением на кортежи (a,a,a) = ('a','b','c') также выдает ошибки. Я действительно не вижу сравнения между вашим примером Python и моим вопросом : (

Ответ №1:

У вас определенно может быть более одного подчеркивания в одной функции. Поскольку они не присваиваются никакому значению, это ничего не переопределит.

Это также легче читать, поскольку вы знаете, что значение не имеет значения, и вы можете обратить внимание на то, что на самом деле влияет на результат. Кроме того, если вы включите все предупреждения при компиляции, вы фактически получите сообщение об ошибке, если вы не используете аргумент, имеющий имя:

 g a b = b
  

вернет Warning: Defined but not used: 'a'

Комментарии:

1. о, я не знал, что это на самом деле языковая функция

2. @theonlygusti да, весь смысл _ в том, что это подстановочный знак в сопоставлении с шаблоном

3. Я бы просто добавил, что вы можете избежать этого последнего предупреждения, если назовете параметр, начинающийся с подчеркивания: _a .

4. Это потому, что вы фактически присваиваете значение переменной, поэтому память фактически выделяется. С помощью Haskell laziness вы можете не заметить разницы, но вы действительно можете использовать эту переменную в своих вычислениях, в отличие от простого подчеркивания

5. @AlexeyRomanov если вы попытаетесь запустить f _a = _a , он скомпилируется и заработает