2012-02-05 108 views
1

这段代码有什么问题?Haskell高阶函数需要帮助

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 

回答

6

这意味着错误说的是什么。您指定你的函数的类型是

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

这意味着,第一个参数必须是一个函数,与该类型Int->Int -> Int,第二个输入必须是Int,然后它会产生一个float。当然,Haskell不知道如何用Int来分割一个函数,这就是你告诉它如何使用表达式f/z


回应评论:no。这不是一个更高阶的函数,但它很接近。请看:

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 S作为输入,并产生一个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 
+0

这是正确的吗?这是一个更高阶的函数吗? divideNo :: Int-> Int-> Int addNum a b = a + b divideby :: Int - > Int - > Int-> a divideby a b c =(addNum a b)'div' c} – user1150071 2012-02-05 07:18:08

1

floatFloat之间的差异......前者是一个类型变量,后者是一个具体类型(您几乎肯定要Double代替)。

这与丹伯顿的答案有关。

1

i want to take addNum function as a Input in to divideby function with divide factor and then output the answer.

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

所以它可能看起来像这样:

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

如果你想建立一些功能的divideby叠加addNum,喜欢拍照addNum的结果为divideby第一个参数,你可以那样做:

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

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