是否可以在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
函数在执行之前会执行与其他函数不同的操作。
我找到的解决方案详述如下。
答案 0 :(得分:1)
我发现问题的解决方案是创建类似于三元运算符的东西。 This link至关重要。
因此,我的问题解决方案的简单演示是:
(>=>) :: a -> (a->b) -> b -- first operator
x >=> y = doSomething1 --fake code
y x
(¨¨) :: a -> (a->b) -> b -- second operator
x ¨¨ y = doSomething2 --fake code
y x
infixl 0 >=>
infixl 1 ¨¨
times2 :: Int -> Int
times2 x = x*2
plus2 :: Int -> Int
plus2 x = x+2
plus3 :: Int -> Int
plus3 x = x+3
main = putStrLn $ show (3 ¨¨ plus2 ¨¨ times2 >=> plus3)
答案 1 :(得分:0)
可以找到几个答案的类似问题here。据我所知,没有构建功能组合分裂的机制。您可以添加某种构造(链接中的更多细节),但它会破坏haskells的功能纯度,因为函数分解应该使用不同的组合规则a=f.(g.h)
和b=(f.g).h
提供不同的结果。 (但它的功能与进行相同的转换相同,因此每次都应返回相同的内容)