在介绍性的Haskell文本中,了解大家的Haskell ,作者定义了一个函数applyTwice,它将函数f应用于参数x,以说明更高阶的中心函数功能范式。
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
到目前为止,我发现Haskell的类型声明清晰,但这个特殊的例子让我感到困惑。我认为这是一个更好地理解类型声明的机会。
作者指出这个构造“表示第一个参数是一个接受某些东西并返回相同内容的函数。第二个参数也是那种类型的东西,返回值也是同一类型。” (text)
此类型声明的含义是什么?为什么不使用(a - > a) - > a,每个 - >表明某种转变?
答案 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 -> a
:applyTwice f :: a -> a
当然是v :: a
然后f (f a)
(应用f
两次{}的函数EM>)。
另一方面,如果你有(a -> a) -> a
,你必须以某种方式从a
类型的函数中产生一个a -> a
,这真的很棘手(想一想:你在哪里得到一个您可以a
提供f
吗?