了解Haskell中的参数

时间:2014-04-24 07:48:26

标签: haskell

我是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>

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

发生了什么事?这是某种干扰吗?

4 个答案:

答案 0 :(得分:3)

确实令人讨厌。 (Fractional a) => a -> (a -> a) -> (a -> a)Fractional a => a -> (a -> a) -> a -> a属于同一类型,因为->是右关联的。

add x y = x + y。其类型为Int -> Int -> IntInt -> (Int -> Int)。所以add 5是一个函数,它接受一个I​​nt并将它加5。

人们可能会写第一个表格的原因可能是强调功能的咖喱形式的使用。

答案 1 :(得分:1)

由于->是关联的,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意味着很明确: - )

答案 2 :(得分:1)

好的,所以区别可以近似为:

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

其中h是一个小数字。在Haskell中,f(x)被写为f x。它需要和x并返回一个数字,就像f(x)获取一个数字并返回另一个数字一样。您的衍生函数是直接翻译。在此处,f是您要在点x处获得的函数,其中小数 h

因此,对于deriv,您需要提供小号h,函数f以及您想要计算衍生x的点。在Haskell,

derive h f x = ...

答案 3 :(得分:0)

不完全是。 h类型为a,可以是任何内容,但需要instance FractionalFractional本身不是一个类型,而是一个类型类,即类型必须支持的接口。

f是一个函数,它接受a类型的某些内容并返回相同类型a的内容。它应该与以前相同a。不是Fractional的其他一些实例;同一个。