【发布时间】:2018-06-13 14:31:38
【问题描述】:
你好,有人可以向我解释这个来自 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
我不明白. fsep 表达式的正确操作数是谁。
( . ) [who is here ] fsep
因为从外观上看,关闭和打开只是一个字符。你能用数据类型(在我们的例子中是一个字符)组成一个函数吗?
P.S 是否可以对函数组合进行柯里化?
所以enclose接受3个参数:其中2个已经固定open和close,第三个是fsep的结果。
基本上你可以做到f(x1...xn-1 xn) . g(y1....yn)(k),只要g(y1...yn)(k)=xn。
【问题讨论】:
-
这实际上是左操作数。
-
.就像任何其他运算符一样。f . g == (.) f g,你可以定义像(f .)和(. g)这样的部分。 -
“是否可以对函数组合进行柯里化”是什么意思?
-
我认为给定一个函数
f和一个函数g他们都必须接受一个参数。在这种情况下,它更像f接受3个参数,其中2个已经固定并且1 取自gx - 其中 x 是第三个参数。 -
(到你问题的最后一句话:)不,你可以做
( f(x1...xn-1) . g(y1...yn) ) (k),只要g(y1...yn)(k) = xn。 ---- 另外,应该是enclose begin end input = char begin <> input <> char end。
标签: haskell function-composition pointfree