[英]How can I demonstrate that this type will be inferred?
我要過去,Haskel類型推斷對我來說有點棘手,盡管看起來很容易。
給定此函數: nat x = x : ( nat (x+1))
其類型: Num t => t -> [t]
這很清楚,因為nat函數接受一個元素並構造一個無限列表。
但是,現在我被要求指定head (nat 2)
的類型head (nat 2)
我完全理解為什么以及head :: [a] -> a
的類型是什么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)
證明你的答案。
謝謝
那么讓我們假設我們已經導出了nat
的類型,我們知道head :: [a] -> a
nat :: Num a => a -> [a]
head :: [b] -> b
然后我們使用不同的類型變量名a
和b
,因為現在我們對a
和b
一無所知,因此我們假設它可以是不同的,因此分配不同的名稱。
現在我們在表達式中看到(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
作為參數調用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.