[英]How do I find out the type of a Haskell function?
为了快速回顾,我们知道以下事实:
s :: sigma -> tau
t :: rho
gamma(sigma) = gamma(rho)
st :: gamma(tau)
。 f :: ([a] -> b) -> a -> [b]
g :: c -> Int -> c
我们想学习fg
的类型。 看来规则(1)可以告诉我们,如果我们适当选择s
, t
, sigma
, tau
, rho
和gamma
。 让我们对如何适当设置它们进行一些猜测,看看会导致什么。
st :: ...
并且我们想知道fg :: ...
,我们应该选择s = f
和t = g
。 s :: sigma -> tau
,我们选择s = f
并从(2)知道f :: ([a] -> b) -> a -> [b]
,因此应该选择sigma = [a] -> b
和tau = a -> [b]
。 t :: rho
并且我们从(3)中选择了t = g
并知道g :: c -> Int -> c
,我们可能应该选择rho = c -> Int -> c
。 总结我们的选择,我们现在将(1)转换为以下形式:
如果f :: ([a] -> b) -> a -> [b]
和g :: c -> Int -> c
和gamma([a] -> b) = gamma(c -> Int -> c)
然后fg :: gamma(a -> [b])
。
(1)中只有一个变量尚未选择值gamma
。 第三个前提对gamma
有一点限制,即它必须满足:
gamma([a] -> b) = gamma(c -> Int -> c)
大概有一个隐含的假设,即它的行为就像是替换,即递归类型结构并替换类型变量,因此先前的相等性假设与此等效:
[gamma(a)] -> gamma(b) = gamma(c) -> Int -> gamma(c)
为了使该方程式成立,我们必须具备以下所有条件:
gamma(c) = [gamma(a)]
gamma(b) = Int -> gamma(c) = Int -> [gamma(a)]
如果我们对gamma(a)
做出任意选择,则这些方程式告诉我们gamma(b)
和gamma(c)
; 让我们选择gamma(a) = a
。 然后:
gamma(a) = a
gamma(b) = Int -> [a]
gamma(c) = [a]
现在我们满足了(1)的前提,因此我们可以得出其结论:
f g :: gamma(a -> [b])
f g :: gamma(a) -> [gamma(b)]
f g :: a -> [Int -> [a]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.