函数组合偏应用

Function composition partial application

你好有人可以向我解释这个来自真实世界 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

我不明白. fsep表达式的右操作数是谁。

( . ) [who is here ]  fsep 

因为从外观上看,close 和 open 只是一个 characters.Can 你用一种数据类型(在我们的例子中是一个字符)编写一个函数?

P.S 是否可以柯里化函数组合?

所以enclose接受3个参数:其中2个已经固定openclose,第三个是fsep.[=19=的结果]

基本上f(x1...xn-1 xn) . g(y1....yn)(k)只要g(y1...yn)(k)=xn即可。

这里没有什么令人兴奋的事情。你引用的函数只是

series open close item = enclose open close . fsep . punctuate (char ',') . map item

enclose open close 之后换行以提高可读性(这不会​​改变其解析方式)。 IE。您询问的 . 的操作数是 enclose open closefsep.

这里,enclose open closeenclose函数的部分应用:

enclose :: Char -> Char -> Doc -> Doc
enclose open   ::  Char -> Doc -> Doc
enclose open close   ::    Doc -> Doc

因此,您在生成 Doc.

的函数之前编写了一个 Doc -> Doc 函数

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

     (enclose open close) . (fsep . punctuate (char ',') . map item)

但由于 f . (g . h) ≡ (f . g) . h 这无关紧要。