【问题标题】:Composing functions in Haskell with arithmetic-type functions在 Haskell 中用算术类型函数组合函数
【发布时间】:2013-02-13 17:35:14
【问题描述】:

我现在正在学习 Haskell,我正在尝试使用函数组合。

我写了两个函数。

let func1 x y = x + y

let func2 t = t*2

但是,当我尝试组合这两个函数时, func2 . func1 1 2我希望得到 6 个。

相反,我得到了这个错误:

   No instance for (Num (a -> b))
      arising from a use of `func1' at <interactive>:1:8-16
    Possible fix: add an instance declaration for (Num (a -> b))
    In the second argument of `(.)', namely `func1 1 2'
    In the expression: func2 . func1 1 2
    In the definition of `it': it = func2 . func1 1 2

有人可以解释为什么这不起作用吗?

【问题讨论】:

  • (func2 .) . func1,或func2 . func1 1。要组合一个带有多个参数的函数,您需要更多 (.)

标签: haskell function-composition


【解决方案1】:

函数应用程序优先于任何运算符,因此您的组合被解析为func2 . (func1 1 2)。也就是说,您的代码尝试将func1 1 2 结果的数字组合成一个函数。请注意,(func2 . func1) 1 2 也不起作用,因为 (.) 仅适用于一元函数。

可以使用(func2 . func1 1) 2,或者以我个人不太习惯的方式多次使用(.),说实话。但在这种特定情况下,完全不使用组合可能会更好:func2 $ func1 1 2 做同样的事情,减少混乱。

【讨论】:

    【解决方案2】:

    由于一个幸运的错误(分配法则),您可以通过Data.Function.on 做到这一点

    import Data.Function
    
    func1 x y = x + y
    func2 t = t*2
    
    func3 = func1 `on` func2
    
    -- or just func3 = (+) `on` (2*)
    

    一般来说,你应该只使用$ 来处理这类事情,因为这就是你正在做的,函数应用程序。这不是真正的作曲工作,所以如果你使用作曲,你会试图将一个方形钉塞进一个圆孔中。

    【讨论】:

      【解决方案3】:

      您尝试做的不是函数组合:您尝试将func1 1 2 应用于func2,这就是$ 运算符的用途。

      func2 $ func1 1 2
      

      【讨论】:

        猜你喜欢
        • 2021-03-11
        • 1970-01-01
        • 2011-03-08
        • 2016-10-24
        • 1970-01-01
        • 2016-04-30
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多