此函数定义的类型是什么“两次f = f(f x)”

时间:2019-01-18 15:30:10

标签: haskell

这是我正在阅读的一本书中的一个练习题,那么这个定义的类型是什么?

twice f x = f (f x)

我了解该功能的工作原理,但无法弄清楚 正确的语法,
它有两个参数,第一个是函数,第二个是我认为并应用两次的基本类型,一个用于x,一个用于返回(fx),这是我们正在尝试做的,但显然是错误的语法

twice :: (f -> a) -> a

您能帮我找到类型吗?

1 个答案:

答案 0 :(得分:5)

您应该从其参数开始减去twice的类型。

x开始,它的类型为x :: _,但我们不知道它是什么,我们称其为ax :: a

然后我们有了f,它是一个函数,从f x可以看出它接受了一个类型为a的参数:f :: a -> _,我们将其称为新的未知类型{{ 1}}:b

因此f :: a -> b的类型应该为f xb,对吗?

但是从(f x) :: b可以看出f (f x)应该是(f x),因此我们可以猜测aa实际上是同一类型,因此我们可以放下b并告诉b

现在我们可以判断类型f :: a -> a是什么:它是一个函数,它接受twice函数和类型a -> a的值并返回第一个参数函数的结果(所以{{1 }})。

所以我们有a