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)
但我想知道如何组合这些功能。
该信息为(.)
Prelude> :i (.)\n(.) :: (b -> c) -> (a -> b) -> a -> c -- Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n表明它接受具有类型的函数a -> b
但(-)有类型
Prelude> :i (-)\nclass Num a where\n ...\n (-) :: a -> a -> a\n ...\n -- Defined in \xe2\x80\x98GHC.Num\xe2\x80\x99\ninfixl 6 -\nRun Code Online (Sandbox Code Playgroud)\n\n因此,可以定义另一个组合运算符来接受具有上述类型的函数,然后可以组合它们。
\n\nof' :: (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\nRun Code Online (Sandbox Code Playgroud)\n\n注意:正如用户 @david-young 正确指出的那样,of'可以通过指定以下类型来更通用:
of' :: (a -> b) -> (c -> d -> a) -> c -> d -> b\nof' f g x y = f (g x y)\nRun Code Online (Sandbox Code Playgroud)\n