功能组成部分应用

时间:2018-06-13 14:31:39

标签: haskell function-composition pointfree

你好,有人可以从功能组合的真实世界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 

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

P.S 是否可以理解功能组合?

所以enclose接受3个参数:其中2个已经修复openclose,第三个参数是fsep的结果。

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

,您就可以g(y1...yn)(k)

1 个答案:

答案 0 :(得分:5)

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

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

enclose open close后面有一个换行符以便于阅读(它没有改变如何解析它)。即您询问的.操作数为enclose open closefsep

此处,enclose open closeenclose函数的部分应用:

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这无关紧要。