功能组成部分应用

Ber*_*ian 1 haskell pointfree function-composition

您好,有人可以从功能组合的Real World Haskell向我解释这个例子:

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
Run Code Online (Sandbox Code Playgroud)

我不明白谁是. fsep表达式的正确操作数.

( . ) [who is here ]  fsep 
Run Code Online (Sandbox Code Playgroud)

因为从它的外观来看它只是一个字符.你可以用数据类型(在我们的例子中是一个字符)组成一个函数吗?

PS是否可以调整功能组成?

所以enclose接受3个参数:其中2个已经固定open,close第三个是结果fsep.

基本上,你可以做f(x1...xn-1 xn) . g(y1....yn)(k) ,只要g(y1...yn)(k)= XN.

lef*_*out 5

这里没什么好激动的.你引用的功能就是

series open close item = enclose open close . fsep . punctuate (char ',') . map item
Run Code Online (Sandbox Code Playgroud)

enclose open close可读性之后使用换行符(这不会改变解析它的方式).即.你所问的操作数是enclose open closefsep.

这里enclose open close是该enclose功能的部分应用:

enclose :: Char -> Char -> Doc -> Doc
enclose open   ::  Char -> Doc -> Doc
enclose open close   ::    Doc -> Doc
Run Code Online (Sandbox Code Playgroud)

因此,你Doc -> Doc在一个产生一个函数的函数之前编写一个函数Doc.


实际上这在技术上并不完全正确:因为它.正确的,正确的操作数实际上是它的所有东西,即

     (enclose open close) . (fsep . punctuate (char ',') . map item)
Run Code Online (Sandbox Code Playgroud)

但由于f . (g . h) ? (f . g) . h这没关系.