我必须定义此函数的类型配置文件:
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 -> 一个
关于haskell - 如何定义该函数的类型配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210584/