Haskell嵌套的Compostition函数

时间:2016-02-01 13:29:19

标签: haskell composition

是否可以在Haskell中操作嵌套函数组合,以便在组合之前对每个函数执行某些处理?

假设一个嵌套的组合,如(lines . unlines . words) "Testing Haskell composition"(它没有意义;它只是一个随机的例子)。 我想在执行linesunlineswords之前做一些事情。像这样的假代码:

performComposition :: [functions] -> returnValue
performComposition [] = ()
performComposition (f:fs) = do something
                            f (performComposition fs )

是否有可能,即使有必要创建一个新的运营商?

编辑(2016年2月17日)

我没有提到我想在最后一个功能上做一些不同的事情。在上面的示例中,words函数在执行之前会执行与其他函数不同的操作。

我找到的解决方案详述如下。

2 个答案:

答案 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提供不同的结果。 (但它的功能与进行相同的转换相同,因此每次都应返回相同的内容)