2013-12-11 41 views
9

Haskell有功能依賴關係的動機是什麼?函數依賴的功能依賴關係的動機

一個例子:

class (Monad m) => MonadSupply s m | m -> s where 
    next :: m (Maybe s) 

它在RWH書中所說的那樣,函數依賴有助於類型檢查。它實際上有什麼幫助?

而且,這段代碼實際上編譯:

class (Monad m) => MonadSupply s m where 
     next :: m (Maybe s) 

但我想,它會產生一個運行時錯誤。

回答

8

編寫不使用函數依賴關係的代碼是很好的,因爲推理很糟糕,所以使用起來很麻煩。

基本上沒有FD,函數get :: MonadState m s => m s將不得不獨立地計算出ms。通常m很容易推斷,但通常s需要明確的註釋。

此外,這是更普遍比我們所需要的,所以我們可以將限制我們typechecker說「對於m,恰好有1 s」,這樣一來,一旦m推斷,s是顯而易見的類型推斷算法

+0

我不明白'對於m,確切的是1 s'。如果我們告訴,因爲'm'只有一個's',那麼爲什麼不把它們寫成'MonadSupply m m'? (我知道我聽起來很瘋狂:)) – Sibi

+0

@Sibi因爲's'通常是不同的,例如'MonadState',我們有'StateT s'和's',很明顯我們所有的'StateT s'我們真的只是想用's'。 – jozefg

+0

任何給定的「供應monad」通常只會提供一種類型!例如,如果你有'm = MySpecialSupplyMonad s'提供's'類型的值,那麼你可以通過讀取類型參數「's'」從類型「'MySpecialSupplyMonad s''」知道供應類型。因此's'可以說在功能上取決於'm'。 –