Здесь нет ничего особенно захватывающего.Функция, которую вы указали, это просто
series open close item = enclose open close . fsep . punctuate (char ',') . map item
с разрывом строки после enclose open close
для удобства чтения (что ничего не меняет в том, как это анализируется).Т.е. операнды к .
, о которых вы спрашивали: enclose open close
и fsep
† .
Здесь enclose open close
- это частичное применение функции enclose
:
enclose :: Char -> Char -> Doc -> Doc
enclose open :: Char -> Doc -> Doc
enclose open close :: Doc -> Doc
, таким образом, вы составляете Doc -> Doc
функцию перед функцией, которая выдает Doc
.
† На самом деле это технически не совсем верно: поскольку .
является правым -ассоциативным, правый операнд на самом деле все направо, т.е.
(enclose open close) . (fsep . punctuate (char ',') . map item)
, но из-за f . (g . h) ≡ (f . g) . h
это нене имеет значения.