Haskell更高阶函数需要帮助

use*_*071 1 haskell higher-order-functions

这段代码有什么问题?

addNum :: Int->Int-> Int
addNum a b = a+b

divideby :: ( Int->Int -> Int ) -> Int  ->float
divideby  f  z  =  f /z
Run Code Online (Sandbox Code Playgroud)

我想将该addNum函数作为divideby带除数的输入,然后输出答案.因此该divideby函数应该充当更高阶函数.

这段代码有什么问题?它给出以下错误:

*** Expression     : f / z
*** Term           : f
*** Type           : Int -> Int -> Int
*** Does not match : Int
Run Code Online (Sandbox Code Playgroud)

Dan*_*ton 6

这正是错误所说的.您已指定函数的类型

divideby :: ( Int->Int -> Int ) -> Int  ->float
Run Code Online (Sandbox Code Playgroud)

这意味着,第一个参数必须是一个函数,具有类型Int->Int -> Int,第二个输入必须是一个Int,然后它将产生一个float.当然,Haskell不知道如何用Int划分函数,这就是你告诉它用表达式做的事情f / z.


回应评论:没有.这不是一个高阶函数,但它很接近.看一看:

addNum :: Int -> Int -> Int
addNum a b = a + b

divideBy :: Int -> Int -> Int -> Int
divideBy a b c = (addNum a b) `div` c
Run Code Online (Sandbox Code Playgroud)

divideBy是一个以3 Int秒为输入的函数,并产生一个Int.由于它的输入仅仅是Int,它不是一个高阶函数.但是,您可以addNum将输入的使用抽象为输入,从而使其成为更高阶的函数.addNum有类型(Int -> Int -> Int),所以,除了我们已经输入的,我们将把它作为我们第一个输入的类型

divideBy :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int
divideBy f a b c = (f a b) `div` c
Run Code Online (Sandbox Code Playgroud)

是一个高阶函数,也可以正确编译并具有意义.:)您可以addNum作为输入传递给此函数.

ghci> divideBy addNum 2 4 6 -- (2 + 4) / 6
1
Run Code Online (Sandbox Code Playgroud)