使用函数组合的 Haskell 绝对差

Ada*_*mes 3 haskell function-composition

我试图定义一个函数来查找两个数字的绝对差,这样两个数字

absoluteDifference 2 5
absoluteDifference 5 2
Run Code Online (Sandbox Code Playgroud)

返回3

这是迄今为止我最大的努力:

absoluteDifference :: Num a => a -> a -> a
absoluteDifference = abs . (-)
Run Code Online (Sandbox Code Playgroud)

在我看来,这适用abs于两个数字相减的结果。但是,这给了我错误

* Could not deduce (Num (a -> a)) arising from a use of `abs'
    (maybe you haven't applied a function to enough arguments?)
  from the context: Num a
    bound by the type signature for:
               absoluteDifference :: Num a => a -> a -> a
    at C:\Users\Adam\dev\daily-programmer\e311\e311.hs:3:1-42
* In the first argument of `(.)', namely `abs'
  In the expression: abs . (-)
  In an equation for `absoluteDifference':
      absoluteDifference = abs . (-)
Run Code Online (Sandbox Code Playgroud)

我不明白。我可以简单地将函数实现为

absoluteDifference a b = abs $ a - b
Run Code Online (Sandbox Code Playgroud)

但我想知道如何组合这些功能。

Hal*_*Ali 5

该信息为(.)

\n\n
Prelude> :i (.)\n(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

表明它接受具有类型的函数a -> b

\n\n

(-)有类型

\n\n
Prelude> :i (-)\nclass Num a where\n  ...\n  (-) :: a -> a -> a\n  ...\n    -- Defined in \xe2\x80\x98GHC.Num\xe2\x80\x99\ninfixl 6 -\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,可以定义另一个组合运算符来接受具有上述类型的函数,然后可以组合它们。

\n\n
of' :: (a -> a) -> (a -> a -> a) -> a -> a -> a\nof' f g a b = f (g a b)\n\nabdiff = abs `of'` (-)\n\nabdiff 1 10\n9\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:正如用户 @david-young 正确指出的那样,of'可以通过指定以下类型来更通用:

\n\n
of' :: (a -> b) -> (c -> d -> a) -> c -> d -> b\nof' f g x y = f (g x y)\n
Run Code Online (Sandbox Code Playgroud)\n