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

时间:2016-08-29 16:06:50

标签: haskell functional-programming ml

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

twice f x = f (f x);

结果应该如下,但我不明白为什么。

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

1 个答案:

答案 0 :(得分:3)

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

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