Рассмотрим следующую задачу: задан ли список длин трех кортежей (String, Int), существует ли пара элементов, имеющих одну и ту же часть "Int"? (Например, [("bob",5),("gertrude",3),("al",5)]
содержит такую пару, но [("bob",5),("gertrude",3),("al",1)]
нет.)
Вот как я мог бы реализовать такую функцию:
import Data.List (sortBy)
import Data.Function (on)
hasPair::[(String,Int)]->Bool
hasPair = napkin . sortBy (compare `on` snd)
where napkin [(_, a),(_, b),(_, c)] | a == b = True
| b == c = True
| otherwise = False
Я использовал сопоставление образцов для привязки имен к части "Int" кортежей, но сначала хочу сортировать (чтобы группировать как члены), поэтому я поместил функцию сопоставления паттернов внутри where
. Но это подводит меня к моему вопросу: какая хорошая стратегия для выбора имен для функций, которые живут внутри предложений where
? Я хочу быть в состоянии думать о таких именах быстро. Для этого примера "hasPair" кажется хорошим выбором, но он уже принят! Я нахожу, что шаблон появляется много - естественно-кажущееся имя вспомогательной функции уже используется внешней функцией, которая ее вызывает. Поэтому я иногда называл такие вспомогательные функции такими вещами, как "op", "foo" и даже "helper" - здесь я выбрал "салфетку", чтобы подчеркнуть ее характер использования, один раз, выбросить.
Итак, дорогие читатели Stackoverflow, что бы вы назвали "салфеткой"? И что еще более важно, как вы относитесь к этой проблеме в целом?