簡體   English   中英

我怎樣才能證明這種類型會被推斷出來?

[英]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

然后我們使用不同的類型變量名ab ,因為現在我們對ab一無所知,因此我們假設它可以是不同的,因此分配不同的名稱。

現在我們在表達式中看到(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作為參數調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM