【发布时间】:2016-02-01 13:29:19
【问题描述】:
是否可以在 Haskell 中操作嵌套函数组合,从而在组合之前对每个函数执行一些处理?
假设像(lines . unlines . words) "Testing Haskell composition" 这样的嵌套组合(这没有意义;这只是一个随机示例)。
在执行lines、unlines 和words 之前,我想做一些事情。像这样的假代码:
performComposition :: [functions] -> returnValue
performComposition [] = ()
performComposition (f:fs) = do something
f (performComposition fs )
是否有可能,即使需要创建一个新的运算符?
编辑(2016 年 2 月 17 日)
我没有提到我想对最后一个函数做一些不同的事情。在上面的示例中,words 函数在执行之前会执行与其他函数不同的操作。
我找到的解决方案详述如下。
【问题讨论】:
-
您可以编写自己的 composition 运算符 - 但
do something部分有副作用... -
你能在你的例子中更具体一点吗?你想用这个做什么?您要解决哪些问题,而仅使用
run before computation after = before >> return computation >>= (\val -> after >> return val)之类的东西还无法解决?不过,这是一个单子函数,所以它不能用来代替computation。 -
等等:你想要这个:
performComposition [] = id; performComposition (f:fs) = f . performComposition fs?但这只是将组合概括为函数列表(它是fold)。 -
构图没有什么神奇之处。它只是
f . g = \x -> f(g x)。如果您希望能够分解这个特定术语,为什么不能分解任何其他术语?2 + 2怎么样?给定4,您能否确定它最初是2 + 2而不是3 + 1?
标签: haskell composition