我要过去了,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)
证明你的答案。
由于
答案 0 :(得分:10)
让我们假设我们已经派生了nat
的类型,我们知道head :: [a] -> a
的类型
nat :: Num a => a -> [a]
head :: [b] -> b
然后我们使用不同的类型变量名a
和b
,因为现在我们对a
和b
一无所知,因此我们假设< 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 ~ c
(a
和c
属于同一类型)。我们知道这一点,因为2
是函数调用的参数,其中nat
为函数,nat
的参数类型为a
。因此,2
的类型和nat
的参数必须相同。
现在我们使用head
作为参数调用(nat 2)
,这意味着我们可以这样说:
head :: [b] -> b
(nat 2) :: Num a => [a]
---------------------------------
head (nat 2) :: Num b => b
我们知道a ~ b
因nat 2
的类型为[a]
而head
的第一个参数应为[b]
类型。这意味着自a ~ b
以来,这意味着类型约束Num a
,也意味着Num b
,反之亦然。
所以类型是:
head (nat 2) :: Num b => b