此代码有什么问题?
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
答案 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)
float
和Float
之间存在差异...前者是一个类型变量,后者是一个具体类型(你几乎肯定想要Double
)。< / p>
这与Dan Burton的回答有关。
答案 2 :(得分:1)
我想将addNum函数作为输入in in divby函数with divide factor,然后输出答案。
首先,divideby
函数是一个函数,需要2个数字f
和z
并返回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
。