我怎样才能证明这种类型会被推断出来?

时间:2018-05-17 19:22:39

标签: haskell types functional-programming type-inference

我要过去了,Haskel类型的推断对我来说有点棘手,尽管看起来很容易。

鉴于此功能:nat x = x : ( nat (x+1))

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

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

但是,现在要求我指定head (nat 2)

的类型

我完全理解为什么以及head :: [a] -> a

的类型

但为什么head (nat 2) :: Num c => c可以解释为什么?

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

编辑

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

原始问题:Give the type of the expression: head (nat 2)

证明你的答案。

由于

1 个答案:

答案 0 :(得分:10)

让我们假设我们已经派生了nat的类型,我们知道head :: [a] -> a的类型

nat :: Num a => a -> [a]
head :: [b] -> b

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

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

2 :: Num c => c

这意味着nat 2具有类型:

nat     :: Num a => a -> [a]
2       :: Num c => c
----------------------------
(nat 2) :: Num a =>      [a]

我们知道a ~ cac属于同一类型)。我们知道这一点,因为2是函数调用的参数,其中nat为函数,nat的参数类型为a。因此,2的类型和nat的参数必须相同。

现在我们使用head作为参数调用(nat 2),这意味着我们可以这样说:

head         ::          [b] -> b
(nat 2)      :: Num a => [a]
---------------------------------
head (nat 2) :: Num b =>        b

我们知道a ~ bnat 2的类型为[a]head的第一个参数应为[b]类型。这意味着自a ~ b以来,这意味着类型约束Num a,也意味着Num b,反之亦然。

所以类型是:

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