【问题标题】:How do I find out the type of a Haskell function?如何找出 Haskell 函数的类型?
【发布时间】:2017-12-25 04:51:58
【问题描述】:

目前我正在准备考试,这是关于 Haskell 的一些我从未真正理解的东西。

类型规则如下

“und”在德语中的意思是“和”。

所以给定的函数是

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

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

【问题讨论】:

  • 请提供一些上下文。指向您获得规则的文档的链接等。目前尚不清楚 gamma 是什么意思。
  • @WillemVanOnsem 我愿意打赌 gamma 是一个替代品,所以 \gamma(\sigma) = \gamma(\rho) 意味着有一种方法可以统一 t 的类型输入类型为s

标签: haskell types functional-programming type-inference lambda-calculus


【解决方案1】:

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

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

我们想了解f g 的类型。看起来规则 (1) 可以告诉我们,如果我们适当地选择 stsigmataurhogamma。让我们猜测一下如何适当地设置它们,看看这会将我们引向何方。

  • 既然(1)的结论是s t :: ...,我们想知道f g :: ...,我们大概应该选择s = ft = g
  • 由于(1)的前提是s :: sigma -> tau,并且我们从(2)中选择了s = f并且知道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)
然后f g :: 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]]

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多