函数组合偏应用
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个已经固定open
和close
,第三个是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 close
和 fsep
†.
这里,enclose open close
是enclose
函数的部分应用:
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
这无关紧要。
你好有人可以向我解释这个来自真实世界 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个已经固定open
和close
,第三个是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 close
和 fsep
†.
这里,enclose open close
是enclose
函数的部分应用:
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
这无关紧要。