1

目前我正在爲我的考試做準備,這是我從來沒有真正理解的關於Haskell的內容。如何找出Haskell函數的類型?

類型規則如下

「UND」 手段 「和」 德語。

所以給定功能

f :: ([a] -> b) -> a -> [b] 
g :: c -> Int -> c 

現在我必須使用上述類型的規則來確定類型(f g)。有人能解釋我如何在這一點上進行?

+0

請提供一些背景。鏈接到您獲得規則的文檔,等等。現在不清楚伽馬的含義。 –

+3

@WillemVanOnsem我敢打賭,gamma是一種替代品,因此\ gamma(\ sigma)= \ gamma(\ rho)意味着有一種方法可以將輸入類型的't'與's'類型統一起來'。 –

回答

4

只需快速瀏覽,我們知道這些事實:

  1. 如果s :: sigma -> tau
    t :: rho
    gamma(sigma) = gamma(rho)
    然後s t :: gamma(tau)
  2. f :: ([a] -> b) -> a -> [b]
  3. g :: c -> Int -> c

我們想了解的f g類型。看起來像規則(1)可以告訴我們,如果我們適當地選擇了s,t,sigma,tau,rhogamma。讓我們對如何適當地設置它們並查看引導我們的位置有一些猜測。

  • 由於(1)說s t :: ...的結論,我們想知道f g :: ...,我們或許應該選擇s = ft = g。由於(1)的前提表示s :: sigma -> tau並且我們選擇了s = f並且從(2)知道f :: ([a] -> b) -> a -> [b],所以我們可能應該選擇sigma = [a] -> btau = 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]]