如何定义此功能的类型配置文件?
How to define the type profile for this function?
我必须定义这个函数的类型配置文件:
twice f x = f (f x);
结果应该是这样的,但是我不太明白为什么。
('a -> 'a) -> 'a -> 'a
(a -> a) -> a -> a
是正确答案。让我们把它分成几部分来找出原因。
- 您的函数有两个参数,
f
和 x
,因此签名将包含三个部分 - 例如,a -> c -> d
- 这些参数中的第一个是一元函数 - 这使得
a = (a -> b)
(请记住 a
可以是任何类型,只要它在签名中只出现一次即可)并且签名看起来像(a -> b) -> c -> d
-
twice
的结果与其第一个参数的结果相同 - 即 d = b
和签名 (a -> b) -> c -> b
f
将 twice
的第二个参数作为其参数 - 这使得 c = a
和签名看起来像这样:(a -> b) -> a -> b
twice
应用于它自己的输出,这意味着 a = b
- 这使得最终签名 (a -> a) -> a -> a
我必须定义这个函数的类型配置文件:
twice f x = f (f x);
结果应该是这样的,但是我不太明白为什么。
('a -> 'a) -> 'a -> 'a
(a -> a) -> a -> a
是正确答案。让我们把它分成几部分来找出原因。
- 您的函数有两个参数,
f
和x
,因此签名将包含三个部分 - 例如,a -> c -> d
- 这些参数中的第一个是一元函数 - 这使得
a = (a -> b)
(请记住a
可以是任何类型,只要它在签名中只出现一次即可)并且签名看起来像(a -> b) -> c -> d
-
twice
的结果与其第一个参数的结果相同 - 即d = b
和签名(a -> b) -> c -> b
f
将twice
的第二个参数作为其参数 - 这使得c = a
和签名看起来像这样:(a -> b) -> a -> b
twice
应用于它自己的输出,这意味着a = b
- 这使得最终签名(a -> a) -> a -> a