【问题标题】:Haskell Nested Compostition FunctionsHaskell 嵌套组合函数
【发布时间】:2016-02-01 13:29:19
【问题描述】:

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

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

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


【解决方案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)

【讨论】:

    【解决方案2】:

    可以在here 找到具有多个答案的类似问题。据我了解,功能组合拆分没有内置机制。您可以添加某种构造(链接中的更多详细信息),但它会破坏haskells 的功能纯度,因为函数分解应该提供不同的结果与不同的组合规则a=f.(g.h)b=(f.g).h。 (但它的相同函数执行相同的转换,所以它应该每次都返回相同的东西)

    【讨论】:

    • 这看起来像是一条评论。如果你认为这个问题是重复的,你应该投票/标记重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多