【问题标题】:Understanding parameters in Haskell了解 Haskell 中的参数
【发布时间】:2014-04-24 16:54:31
【问题描述】:

我是 Haskell 的新手,正在尝试调用我从中获得的函数: http://www.haskell.org/haskellwiki/Functional_differentiation

  derive :: (Fractional a) => a -> (a -> a) -> (a -> a)
  derive h f x = (f (x+h) - f x) / h

我无法理解该方法的参数以及 h f x 对应的内容。

据我了解:

h 是小数

f 是一个接受小数并返回小数的函数

x ??这是哪里来的?

但是当我输入 GHCi 时:

Prelude> let derive h f x = (f (x+h) - f x) / h
Prelude> :t derive
derive :: Fractional a => a -> (a -> a) -> a -> a
Prelude>

我从中得到了不同的类型。

发生了什么事?这是某种咖喱吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    确实是在柯里化。 (Fractional a) => a -> (a -> a) -> (a -> a)Fractional a => a -> (a -> a) -> a -> a 是同一类型,因为 -> 是右关联的。

    采取add x y = x + y。它的类型是Int -> Int -> Int ~ Int -> (Int -> Int)。所以add 5 是一个函数,它接受一个 Int 并将 5 添加到它。

    写第一种形式的原因可能是强调函数的柯里化形式的使用。

    【讨论】:

      【解决方案2】:

      因为->是右结合的,所以derive的类型可以写成

      derive :: (Fractional a) => a -> (a -> a) -> a -> a
      

      换句话说,

      derive :: (Fractional a) => a -> (a -> a) -> (a -> a)
      

      等于

      derive :: (Fractional a) => a -> (a -> a) -> a -> a
      

      我认为它使x 的含义非常清楚:-)

      【讨论】:

        【解决方案3】:

        好的,所以微分可以近似为:

        df(x)/dx = (f(x+h) - f(x)) / h , in the limit of h -> 0 at point x
        

        其中h 是一个小数字。在 Haskell 中,f(x) 写作f x。它接受 and x 并返回一个数字,就像 f(x) 接受一个数字并返回另一个一样。您的导数功能是直接翻译。这里,f 是您要在点 x 处导出的函数,小数字 h

        因此,对于 derivative,您需要提供小数 h、函数 f 以及要计算导数 x 的点。在 Haskell 中,

        derive h f x = ...
        

        【讨论】:

          【解决方案4】:

          不完全是。 ha 类型,可以是任何类型,但它需要instance FractionalFractional 本身不是类型,而是类型类,即类型必须支持的接口。

          f 是一个函数,它接受 a 类型的东西并返回相同类型的东西 a。它应该和以前一样a。不是Fractional 的其他实例;同一个。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-22
            • 2016-04-09
            • 1970-01-01
            • 2016-01-31
            • 2018-02-05
            • 2019-02-02
            • 1970-01-01
            相关资源
            最近更新 更多