理解高阶函数类型声明

时间:2015-11-25 18:07:57

标签: haskell type-declaration

在介绍性的Haskell文本中,了解大家的Haskell ,作者定义了一个函数applyTwice,它将函数f应用于参数x,以说明更高阶的中心函数功能范式。

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

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

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

此类型声明的含义是什么?为什么不使用(a - > a) - > a,每个 - >表明某种转变?

2 个答案:

答案 0 :(得分:3)

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

所以要使用applyTwice

  • 传递一个函数,当给定a时,将返回a
  • 传递a
  • 获得a作为结果

答案 1 :(得分: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吗?