Частичное применение композиции функций - PullRequest
0 голосов
/ 13 июня 2018

Здравствуйте, может кто-нибудь объяснить мне этот пример из Real World Haskell функции composiiton:

data Doc = ToBeDefined deriving (Show) 

(<>) :: Doc -> Doc -> Doc
a <> b = undefined

series :: Char -> Char -> (a -> Doc) -> [a] -> Doc
series open close item = enclose open close
                         . fsep . punctuate (char ',') . map item
                         -- Who does fsep compose with?

enclose :: Char -> Char -> Doc -> Doc
enclose begin end input = char begin <> input <> char <> end

Я не понимаю, кто является правильным операндом выражения . fsep.

( . ) [who is here ]  fsep 

Потому что, судя по всему, это закрытые и открытые только символы. Можете ли вы составить функцию с типом данных (в нашем случае это символ)?

PS Можно ли каррировать композицию функций?

, поэтому enclose принимает 3 параметра: 2 из них уже зафиксированы open и close, а третий является результатом fsep.

В основном вы можете сделать f(x1...xn-1 xn) . g(y1....yn)(k) пока g(y1...yn)(k) = xn.

1 Ответ

0 голосов
/ 13 июня 2018

Здесь нет ничего особенно захватывающего.Функция, которую вы указали, это просто

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 это нене имеет значения.

...