Подсказка: используйте не спеша

У меня есть эта строка кода:

map (\(u,v) -> flatTorus n u v) gridUV

Hlint предлагает мне заменить его

map (uncurry (flatTorus n)) gridUV

Какова мотивация этого предложения? Это только для краткости, или что-то еще (производительность)? Потому что, хотя он длиннее, я считаю, что первый код легче читать.

На самом деле мой вопрос носит более общий характер, потому что это всего лишь пример: Hlint предложения обычно основаны только на мотивации краткости или есть другие улучшения позади предложений?

2 ответа

Я думаю, что Хлинт предпочитает использовать uncurry потому что это дает вам инвариантное представление обратного вызова. Лямбда-выражения по своей природе чувствительны к представлению, так как

\(u, v) -> flatTorus n u v

эквивалентно

\(x, y) -> flatTorus n x y

даже если они отличаются друг от друга по тексту.

С помощью uncurry освобождает читателей от когнитивной нагрузки выполнения альфа-эквивалентности в их голове (например, признание того, что два вышеупомянутых выражения одинаковы), но затем обременяет их когнитивной нагрузкой необходимости запоминать словарь комбинаторов. В конечном счете, это вопрос вкуса.

Это на самом деле не совсем эквивалентно.

(\(x, y) -> (,) x y) undefined = undefined
uncurry (,) undefined = (undefined, undefined)

Должны ли вы принять любое предложение использовать uncurry недоверчиво. Подумайте, поможет ли эта лишняя лень, повредит или не изменит.

Другие вопросы по тегам