这个问题在这里已经有了答案:
Type Inference in Haskell for functions
(1 个回答)
2年前关闭。
我正在准备我的考试,但有些东西我无法理解。
功能:
tw f x = f (f x)
f x y = (y, x)
我能够确定“f”的类型是
f :: t1 -> t -> (t, t1)
但无法确定“tw”的类型。
假定类型 tw:
tw :: (t -> t) -> t -> t
谢谢!
最佳答案
让我们分析一下函数tw
:
tw f x = f (f x)
tw
以 f
为参数和 x
.目前我们对这些参数了解不多,所以我们将它们作为类型 f :: a
和 x :: b
.现在我们看到一个带有
f
的函数应用程序。函数和x
参数。因此,这意味着 f
是一个接受 b
类型值的函数( x
的类型),并返回一些东西。因此,我们指定 f
类型为 f :: b -> c
, 与 c
我们引入了一个新的类型变量。因此我们知道 f x :: c
.我们进一步看到,有一个功能应用程序
f :: b -> c
函数和 f x :: c
参数。由于f
的参数类型是 b
, 和 f x
类型为 c
.因此我们得出结论,b
和 c
必须是同一类型。因此,这意味着我们派生为类型:
x :: b
f :: b -> b
我们可以进一步分析
tw f x
的类型通过确定 f (f x)
的类型.由于f x
有类型 f x :: b
, 和 f
有类型 f :: b -> b
, 我们知道 f (f x)
有类型 f (f x) :: b
.这意味着 tw
的类型是:tw :: (b -> b) -> b -> b
如果我们替换
b
对于 t
,然后我们获得预期的类型签名。但是自从b
和 t
只是变量,没关系。
关于haskell - 如何确定 Haskell 函数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285479/