目前我正在爲我的考試做準備,這是我從來沒有真正理解的關於Haskell的內容。如何找出Haskell函數的類型?
類型規則如下
「UND」 手段 「和」 德語。
所以給定功能
f :: ([a] -> b) -> a -> [b]
g :: c -> Int -> c
現在我必須使用上述類型的規則來確定類型(f g)
。有人能解釋我如何在這一點上進行?
目前我正在爲我的考試做準備,這是我從來沒有真正理解的關於Haskell的內容。如何找出Haskell函數的類型?
類型規則如下
「UND」 手段 「和」 德語。
所以給定功能
f :: ([a] -> b) -> a -> [b]
g :: c -> Int -> c
現在我必須使用上述類型的規則來確定類型(f g)
。有人能解釋我如何在這一點上進行?
只需快速瀏覽,我們知道這些事實:
s :: sigma -> tau
t :: rho
gamma(sigma) = gamma(rho)
s t :: gamma(tau)
。f :: ([a] -> b) -> a -> [b]
g :: c -> Int -> c
我們想了解的f g
類型。看起來像規則(1)可以告訴我們,如果我們適當地選擇了s
,t
,sigma
,tau
,rho
和gamma
。讓我們對如何適當地設置它們並查看引導我們的位置有一些猜測。
s t :: ...
的結論,我們想知道f g :: ...
,我們或許應該選擇s = f
和t = g
。由於(1)的前提表示s :: sigma -> tau
並且我們選擇了s = f
並且從(2)知道f :: ([a] -> b) -> a -> [b]
,所以我們可能應該選擇sigma = [a] -> b
和tau = a -> [b]
。 (1)的前提稱t :: rho
,並且我們選擇了t = g
並且從(3)知道g :: c -> Int -> c
,我們應該可以選擇rho = c -> Int -> c
。總結我們的選擇,我們現在已經改變了(1)這種形式:
如果f :: ([a] -> b) -> a -> [b]
和g :: c -> Int -> c
和gamma([a] -> b) = gamma(c -> Int -> c)
然後f g :: gamma(a -> [b])
。
從(1)中只有一個變量我們還沒有選擇一個值,即gamma
。第三個前提約束gamma
一點點,即,它必須滿足:
gamma([a] -> b) = gamma(c -> Int -> c)
大概有一個隱含的假設,它像一個替代,也就是遞歸超過型結構和更換類型變量,所以以前的平等假設相當於這一個:
[gamma(a)] -> gamma(b) = gamma(c) -> Int -> gamma(c)
對於這個公式是正確的,我們必須有所有這些事情:
gamma(c) = [gamma(a)]
gamma(b) = Int -> gamma(c) = Int -> [gamma(a)]
如果我們對gamma(a)
進行任意選擇,這些等式告訴我們gamma(b)
和gamma(c)
的結果;我們選擇gamma(a) = a
。然後:
gamma(a) = a
gamma(b) = Int -> [a]
gamma(c) = [a]
現在我們已經滿足(1),所以我們要學習它的結論的前提:
f g :: gamma(a -> [b])
f g :: gamma(a) -> [gamma(b)]
f g :: a -> [Int -> [a]]
請提供一些背景。鏈接到您獲得規則的文檔,等等。現在不清楚伽馬的含義。 –
@WillemVanOnsem我敢打賭,gamma是一種替代品,因此\ gamma(\ sigma)= \ gamma(\ rho)意味着有一種方法可以將輸入類型的't'與's'類型統一起來'。 –