Рассмотрим следующую проблему: для заданного списка длиной три кортежа (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, что бы вы назвали «салфеткой»? И что еще более важно, как вы вообще подходите к этому вопросу?
go
это путь :) - person Riccardo T.   schedule 24.05.2012napkin
в том виде, в каком он написан в настоящее время, не очень надежен (в списке должно быть ровно три члена), если вы подумаете об этом немного подробнее, возможно, он предложит лучшее имя. - person stephen tetley   schedule 24.05.2012napkin
, когда писал это. Можете ли вы сказать, что это верно в целом: если вам трудно назвать функцию, ваш дизайн, вероятно, нуждается в улучшении? Если это правда, то это довольно мощная концепция... - person gcbenison   schedule 24.05.2012hasPair
будет работать для имени вспомогательной функции. Однако многие люди обычно считают, что скрытие внешних привязок вредно. - person gcbenison   schedule 27.05.2012