Haskell 如何证明将推断此类型?

Haskell 如何证明将推断此类型?,haskell,types,functional-programming,type-inference,Haskell,Types,Functional Programming,Type Inference,我正在复习Haskel类型的推理,这对我来说有点棘手,尽管它看起来很容易 给定此函数:natx=x:(nat(x+1)) 类型为:Num t=>t->[t] 这很清楚,因为nat函数接受一个元素并构造一个无限列表 但是,现在我被要求指定头的类型(nat 2) 我完全理解头的原因和类型::[a]->a 但是为什么是头(NAT2)::numc=>c有人能解释为什么吗 从最通用的类型A->B开始(我假设它是A->B,因为它需要一个参数),接下来是什么 编辑 这给出表达式的类型:head(nat 2)意

我正在复习Haskel类型的推理,这对我来说有点棘手,尽管它看起来很容易

给定此函数:
natx=x:(nat(x+1))

类型为:
Num t=>t->[t]

这很清楚,因为nat函数接受一个元素并构造一个无限列表

但是,现在我被要求指定
头的类型(nat 2)

我完全理解
头的原因和类型::[a]->a

但是为什么是头(NAT2)::numc=>c有人能解释为什么吗

从最通用的类型A->B开始(我假设它是A->B,因为它需要一个参数),接下来是什么

编辑

给出表达式的类型:head(nat 2)
意味着我应该给出函数的类型,或者仅仅是返回的值,它实际上必须是一个数字,这就是为什么它是
Num c=>c
,我刚才回答了我的问题吗

原始问题:
给出表达式的类型:head(nat2)

证明你的答案是正确的


谢谢

好吧,让我们假设我们已经导出了
nat的类型,并且我们知道

然后我们使用不同类型的变量名
a
b
,因为现在我们对
a
b
一无所知,因此我们假设变量名可以不同,因此分配不同的名称

现在我们在表达式中看到
(nat2)
。我们知道
2
具有以下类型:

2 :: Num c => c
nat     :: Num a => a -> [a]
2       :: Num c => c
----------------------------
(nat 2) :: Num a =>      [a]
这意味着
nat2
具有以下类型:

2 :: Num c => c
nat     :: Num a => a -> [a]
2       :: Num c => c
----------------------------
(nat 2) :: Num a =>      [a]
我们知道
a~c
a
c
是同一类型)。我们知道这一点,因为
2
是函数调用的参数,
nat
作为函数,而
nat
作为参数类型
a
。因此,
2
的类型和
nat
的参数需要相同

现在我们用as参数调用
head
(nat 2)
,这意味着我们推断:

head         ::          [b] -> b
(nat 2)      :: Num a => [a]
---------------------------------
head (nat 2) :: Num b =>        b
我们知道
a~b
,因为
nat2
的类型是
[a]
,而
头的第一个参数应该是
[b]
。这意味着由于
a~b
,这意味着类型约束
numa
,也意味着
numb
,反之亦然

所以类型是:

head (nat 2) :: Num b => b

我不确定我是否理解你的问题?您指定了
nat
的类型和
head
的类型,为什么在组合它们时结果会混淆?组合它们是什么意思?您的问题是“给出类型…”,并且您声明它是
Num c=>c
。你的问题是什么?您通过函数应用程序组合了
2
nat
head
的类型。这是我能想到的最好的答案,谢谢!。我知道这些类型现在是如何传播的。你知道,当你读了10遍,你得到了它,你终于得到了它!抱歉花了太长时间,但是你知道haskell的类型推断有什么好的参考资料吗?Mark Jones的论文(虽然是1994年的)在haskell类型推断中是明确的:早期的技术报告版本可以在