1

这段代码有什么问题?

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
4

3 回答 3

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 Ints 作为输入的函数,并产生一个Int. 由于它的输入仅仅是Int,它不是一个高阶函数。但是,您可以将使用抽象addNum为输入,从而使其成为高阶函数。addNum有 type (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
于 2012-02-05T06:52:24.737 回答
1

float和之间有区别Float……前者是类型变量,后者是具体类型(您几乎肯定想要它Double)。

这与丹伯顿的回答有关。

于 2012-02-05T07:25:41.220 回答
1

我想将 addNum 函数作为具有除法因子的除法函数的输入,然后输出答案。

首先,dividebyfunction 是一个函数,它接受 2 个数字fz返回f/z。正如丹伯顿所说,如果divideby函数返回两个值的除法Int,它不能将函数Int -> Int -> Int作为参数。

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

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

如果你想构造一些函数作为 and 的叠加dividebyaddNum比如将addNum' 的结果作为 的第一个参数divideby,你可以这样做:

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

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

于 2012-02-05T08:42:05.057 回答