繁体   English   中英

如何找出Haskell函数的类型?

[英]How do I find out the type of a Haskell function?

目前,我正在为考试做准备,这是有关Haskell的一些我从未真正理解的事情。

类型规则如下

“ und”在德语中意为“和”。

所以给定的功能是

f :: ([a] -> b) -> a -> [b]
g :: c -> Int -> c

现在,我必须使用上面的类型规则来确定类型(fg) 有人可以解释一下如何进行吗?

为了快速回顾,我们知道以下事实:

  1. 如果s :: sigma -> tau
    t :: rho
    gamma(sigma) = gamma(rho)
    然后st :: gamma(tau)
  2. f :: ([a] -> b) -> a -> [b]
  3. g :: c -> Int -> c

我们想学习fg的类型。 看来规则(1)可以告诉我们,如果我们适当选择stsigmataurhogamma 让我们对如何适当设置它们进行一些猜测,看看会导致什么。

  • 由于(1)的结论为st :: ...并且我们想知道fg :: ... ,我们应该选择s = ft = g
  • 由于(1)的前提是s :: sigma -> tau ,我们选择s = f并从(2)知道f :: ([a] -> b) -> a -> [b] ,因此应该选择sigma = [a] -> btau = a -> [b]
  • 由于(1)的前提是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM