如何定义此功能的类型配置文件?

How to define the type profile for this function?

我必须定义这个函数的类型配置文件:

twice f x = f (f x);

结果应该是这样的,但是我不太明白为什么。

('a -> 'a) -> 'a -> 'a

(a -> a) -> a -> a 是正确答案。让我们把它分成几部分来找出原因。

  1. 您的函数有两个参数,fx,因此签名将包含三个部分 - 例如,a -> c -> d
  2. 这些参数中的第一个是一元函数 - 这使得 a = (a -> b)(请记住 a 可以是任何类型,只要它在签名中只出现一次即可)并且签名看起来像(a -> b) -> c -> d
  3. twice 的结果与其第一个参数的结果相同 - 即 d = b 和签名 (a -> b) -> c -> b
  4. ftwice 的第二个参数作为其参数 - 这使得 c = a 和签名看起来像这样:(a -> b) -> a -> b
  5. twice 应用于它自己的输出,这意味着 a = b - 这使得最终签名 (a -> a) -> a -> a