我必须定义此函数的类型配置文件:
twice f x = f (f x);
结果应该如下,但我不明白为什么。
('a -> 'a) -> 'a -> 'a
答案 0 :(得分:3)
(a -> a) -> a -> a
是正确的答案。让我们把它分成几块来找出原因。
f
和x
,因此签名将包含三个部分 - 例如a -> c -> d
a = (a -> b)
(记住a
可以是任何类型,只要它在签名中只出现一次)并且签名看起来像{{ 1}} (a -> b) -> c -> d
的结果与其第一个参数的结果相同 - 这使得twice
和签名d = b
(a -> b) -> c -> b
将f
的第二个参数作为其参数 - 这会使twice
和签名看起来像这样:c = a
(a -> b) -> a -> b
已应用于自己的输出,这意味着twice
- 这会产生最终签名a = b