Haskell 如何证明将推断此类型?
我正在复习Haskel类型的推理,这对我来说有点棘手,尽管它看起来很容易 给定此函数: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)意
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类型推断中是明确的:早期的技术报告版本可以在