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)
这正是错误所说的.您已指定函数的类型
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)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |