Haskell更高阶函数需要帮助

时间:2012-02-05 06:46:43

标签: haskell higher-order-functions

此代码有什么问题?

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

divideby :: ( Int->Int -> Int ) -> Int  ->float
divideby  f  z  =  f /z

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

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

*** Expression     : f / z
*** Term           : f
*** Type           : Int -> Int -> Int
*** Does not match : Int

3 个答案:

答案 0 :(得分:6)

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

divideby :: ( Int->Int -> Int ) -> Int  ->float

这意味着,第一个参数必须是函数,类型为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

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

这个是一个高阶函数,它也能正确编译并具有意义。 :)您可以将addNum作为此函数的输入传递。

ghci> divideBy addNum 2 4 6 -- (2 + 4) / 6
1

答案 1 :(得分:1)

floatFloat之间存在差异...前者是一个类型变量,后者是一个具体类型(你几乎肯定想要Double)。< / p>

这与Dan Burton的回答有关。

答案 2 :(得分:1)

  

我想将addNum函数作为输入in in divby函数with divide factor,然后输出答案。

首先,divideby函数是一个函数,需要2个数字fz并返回f/z。正如Dan Burton所说,如果divideby函数返回两个Int值的除法,则它不能将函数Int -> Int -> Int作为参数。

所以它看起来像那样:

divideby :: Int -> Int -> Float
divideby  f z  =  (fromIntegral f) / (fromIntegral z)

如果你想构建一些函数作为dividebyaddNum的叠加,就像把addNum的结果作为divideby的第一个参数一样,你可以这样做的是:

newFunction :: Int -> Int -> Float
newFunction a b = divideby (addNum a b) b

实际上等于(a+b)/b