2013-12-11 16 views
9

Qual è la motivazione di avere dipendenze funzionali in Haskell?Motivazione di avere dipendenze funzionali

Un esempio di una dipendenza funzionale:

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

Si afferma nel libro RWH, che la dipendenza funzionale aiuta il tipo di controllo. In che modo aiuta davvero?

Inoltre, questo pezzo di codice in realtà compila:

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

Ma credo, che produrrà un errore di runtime.

risposta

8

È perfettamente corretto scrivere codice non utilizzando dipendenze funzionali, è solo un problema da utilizzare poiché l'inferenza fa schifo.

Fondamentalmente senza FD, la funzione get :: MonadState m s => m s dovrà calcolare m e s in modo indipendente. Solitamente lo m è facilmente deducibile, ma spesso s richiederebbe un'annotazione esplicita.

Inoltre, questo è molto più generale di quanto abbiamo bisogno, così invece si può limitare la nostra coontrollore dei tipo a dire "Per m, c'è esattamente 1 s", in questo modo, una volta m si evince, s è evidente per l'inferenza di tipo algoritmo

+0

Non riesco a capire come 'Per m, c'è esattamente 1 s'. Se diciamo, per 'm' c'è esattamente uno' s', allora perché non scriverli come 'MonadSupply m m'? (So ​​che sto suonando pazzo :)) – Sibi

+0

@Sibi Siccome 's' è di solito diverso, per esempio con' MonadState', abbiamo 'StateT s' e' s', chiaramente per tutti 'StateT s' siamo veramente voglio solo usare 's'. – jozefg

+0

Un dato "rifornimento" tipicamente fornirà solo un tipo! Ad esempio se hai 'm = MySpecialSupplyMonad s' che fornisce valori di tipo' s', allora sai dal tipo "' MySpecialSupplyMonad s' "il tipo di fornitura semplicemente leggendo l'argomento type" 's'". Così si può dire che 's' dipende funzionalmente da' m'. –

Problemi correlati