这是我正在阅读的一本书中的一个练习题,那么这个定义的类型是什么?
twice f x = f (f x)
我了解该功能的工作原理,但无法弄清楚
正确的语法,
它有两个参数,第一个是函数,第二个是我认为并应用两次的基本类型,一个用于x,一个用于返回(fx),这是我们正在尝试做的,但显然是错误的语法
twice :: (f -> a) -> a
您能帮我找到类型吗?
答案 0 :(得分:5)
您应该从其参数开始减去twice
的类型。
从x
开始,它的类型为x :: _
,但我们不知道它是什么,我们称其为a
:x :: a
。
然后我们有了f
,它是一个函数,从f x
可以看出它接受了一个类型为a
的参数:f :: a -> _
,我们将其称为新的未知类型{{ 1}}:b
。
因此f :: a -> b
的类型应该为f x
:b
,对吗?
但是从(f x) :: b
可以看出f (f x)
应该是(f x)
,因此我们可以猜测a
和a
实际上是同一类型,因此我们可以放下b
并告诉b
。
现在我们可以判断类型f :: a -> a
是什么:它是一个函数,它接受twice
函数和类型a -> a
的值并返回第一个参数函数的结果(所以{{1 }})。
所以我们有a
。