Оператор композиции функции .
определяется следующим образом:
(.) f g = \x -> f (g x)
Или то же самое в инфиксной форме:
f . g = \x -> f (g x)
На английском языке это можно выразить так: композиция из двух функций f
и g
- это другая функция, которая принимает аргумент x
, передает его в функцию g
, а затем передает возвращаемое значение g
в функцию f
Если вы посмотрите на свой первый фрагмент:
let f s = filter (isDigit.head) (groupBy (on (==) isDigit) s)
Если ваш косоглазие достаточно сложное, вы можете увидеть, что это функция, которая принимает аргумент s
, передает его в функцию groupBy (on (==) isDigit)
, а затем передает возвращаемое значение в функцию filter (isDigit.head)
, которая, согласно моему объяснению выше, может быть выражена в виде комбинации двух функций - filter (isDigit.head)
и groupBy (on (==) isDigit)
, что является вашим вторымфрагмент.