2015-11-25 162 views
1

在介绍性的Haskell文本中,了解您对Haskell的好作,作者定义了一个函数applyTwice,两次将函数f应用于参数x以说明更高阶功能范式的核心功能。了解高阶函数类型声明

applyTwice :: (a -> a) -> a -> a 
applyTwice f x = f (f x) 

到目前为止,我发现Haskell的类型声明是清晰的,但是这个特殊的例子让我感到困惑。我认为这是一个更好理解类型声明的机会。

作者指出这个构造“表示第一个参数是一个函数,它接受某些东西并返回相同的东西,第二个参数也是该类型的东西,返回值也是相同的类型。 (text

这种类型声明是什么意思?为什么不使用(a - > a) - > a,每个 - >表示某种转换?

回答

3

在每个->之间是函数参数的类型,最后一个是函数返回值的类型。所以这里的形状是_ -> _ -> _(一个函数带两个参数)。但第一个参数恰好是一个函数,并且形状为_ -> _(带一个参数)。

所以使用applyTwice

  • 传递一个函数,鉴于当a将返回a
  • 传递一个a
  • 得到a作为结果
+0

?或者,等价地,传递一个函数,当给定一个'a'时将返回一个'a',并得到一个函数,当给定一个'a'时将返回一个'a'。 – user2407038

2

你应该东西a -> b作为一个功能,需要一个a并输出一个b - 所以如果f是这样一个功能:f :: a -> b然后每次你给它一个v :: a(写作f v),你会得到一个b(f v) :: b

现在当然这样的功能型是太 - 高阶...;)

现在(a -> a) -> a -> a(a -> a) -> (a -> a)所以这是一个功能(姑且称之为applyTwice),其当给定f :: a -> a将产生另一个功能a -> aapplyTwice f :: a -> a这当然是取v :: a然后f (f a)应用f两次)的函数。

如果你必须以某种方式从a -> a类型的函数,它是真正棘手产生a另一方面也要(a -> a) -> a(想一想:你在哪里得到的a从您可以养活f