这正是错误所说的意思。您已指定函数的类型是
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
s 作为输入的函数,并产生一个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