Подсказка: используйте не спеша
У меня есть эта строка кода:
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
недоверчиво. Подумайте, поможет ли эта лишняя лень, повредит или не изменит.