Ответ 1
а также, если это возможно, предпочтительнее использовать код точки.
Не "где возможно", но "где он улучшает читаемость (или имеет другие преимущества)".
Чтобы освободить ваш
agreeLen x y = length $ takeWhile (\(a,b) -> a == b) (zip x y)
Первым шагом будет переместить ($)
вправо и заменить тот, который у вас есть с (.)
:
agreeLen x y = length . takeWhile (\(a,b) -> a == b) $ zip x y
Теперь вы можете перемещать его еще дальше:
agreeLen x y = length . takeWhile (uncurry (==)) . zip x $ y
и вы можете сразу отбросить один аргумент,
agreeLen x = length . takeWhile (uncurry (==)) . zip x
Затем вы можете переписать это как префиксное приложение оператора композиции,
agreeLen x = (.) (length . takeWhile (uncurry (==))) (zip x)
и вы можете написать
f (g x)
а
f . g $ x
вообще, здесь с
f = (.) (length . takeWhile (uncurry (==)))
и g = zip
, давая
agreeLen x = ((.) (length . takeWhile (uncurry (==)))) . zip $ x
из которого легко удаляется аргумент x
. Затем вы можете преобразовать префиксное приложение (.)
в раздел и получить
agreeLen = ((length . takeWhile (uncurry (==))) .) . zip
Но это менее читаемо, чем оригинал, поэтому я не рекомендую это делать, кроме практики преобразования выражений в стиль без точек.