Обратите внимание, что вторая форма приводит к ошибке синтаксического анализа, а не ошибка типа. У вас просто не может быть двух операторов бок о бок. Когда вы помещаете выражение между .
и $
, , то приоритеты оператора вступают в игру. Так как .
имеет более высокий приоритет, выражение между .
и $
становится правильным операндом .
, а результат оператора точки становится левым операндом доллара. Если вы должны были отменить свои приоритеты (или написать код, предположив, что они были), вы получите ошибку типа (если типы не совпадают в любом случае).
Вы можете написать что-то вроде второй формы с помощью секции оператора:
g1 = (flip map .) $ flip take $ iterate (+1) 1
Но я бы сказал, что наиболее читаемыми точка свободного обозначения
g1 = flip map . flip take (iterate (+1) 1)
И на самом деле iterate (+1) 1
может быть сокращен :
g1 = flip map . flip take [1..]
Далее, небольшое обессоливание помогает нам избавиться от flip take
:
g1 = flip map . enumFromTo 1