为什么Haskell中的这两个函数具有相同的类型?

Tel*_*hus 1 haskell types function

我正在研究Graham Hutton的Haskell编程,第3章的练习问"什么是类型?" 为功能twice f x = f (f x).

我想我理解为什么答案是twice :: (t -> t) -> t -> t.(编辑:我明白为什么.看看我对Paolo答案的评论.)然而,为了实验,我写了另一个函数thrice f x = f (f (f x)).

我绝对明白的是为什么thrice还有一种类型thrice :: (t -> t) -> t -> t.

它们以我期望的方式工作(见下文),但我看不出这种类型是否thrice有意义.

来自ghci:

>> twice tail [0,1,2,3,4]
[2,3,4]
>> thrice tail [0,1,2,3,4]
[3,4]
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 8

也许更容易看到无点:

twice f = f . f
thrice f = f . f . f
Run Code Online (Sandbox Code Playgroud)

所以你要自己组合f几次.为了能够自己组合f,应用于f参数的结果必须具有合适的类型,以便f反过来可以应用于该参数.现在,如果你开始

f :: a -> r     -- argument type -> result type
Run Code Online (Sandbox Code Playgroud)

适用性条件意味着r必须匹配a.对于类型变量,这意味着r = a.因此,twice除了thrice从某种类型到相同类型的函数并将函数从该类型返回到相同类型,

twice :: (a -> a) -> (a -> a)
thrice :: (a -> a) -> (a -> a)
Run Code Online (Sandbox Code Playgroud)

由于函数类型箭头是右关联的(x -> y -> z = x -> (y -> z)可以省略类型中的最后一个括号).