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)
也许更容易看到无点:
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)可以省略类型中的最后一个括号).