【问题标题】:Haskell higher order function help needed需要 Haskell 高阶函数帮助
【发布时间】:2012-02-05 06:46:43
【问题描述】:

这段代码有什么问题?

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

【问题讨论】:

    标签: haskell higher-order-functions


    【解决方案1】:

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

    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 的类型为 (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
    

    【讨论】:

    • 这是正确的吗?这是一个高阶函数吗? {addNum :: Int->Int-> Int addNum a b = a+b 除数 :: Int -> Int -> Int-> a 除数 a b c = (addNum a b) div c}
    【解决方案2】:

    floatFloat 之间存在区别...前者是类型变量,后者是具体类型(您几乎肯定需要 Double 代替)。

    这与 Dan Burton 的回答有关。

    【讨论】:

      【解决方案3】:

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

      首先,divideby函数是一个函数,它接受两个数字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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2017-04-21
        • 1970-01-01
        • 2022-01-15
        • 2011-12-13
        相关资源
        最近更新 更多