2013-12-11 13 views
9

Jaka jest motywacja posiadania zależności funkcjonalnych w Haskell?Motywacja posiadania zależności funkcjonalnych

Przykładem zależności funkcjonalnej:

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

To jest zawarta w książce RWH, że zależność funkcjonalna pomaga sprawdzania typu. Jak to naprawdę pomaga?

Również ten kawałek kodu faktycznie kompiluje:

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

Ale myślę, będzie produkować błąd wykonania.

Odpowiedz

8

Jest całkiem dobrze napisać kod nie używając zależności funkcjonalnych, jest to po prostu uciążliwe, ponieważ wnioskowanie jest do bani.

Zasadniczo bez FD, funkcja get :: MonadState m s => m s będzie musiała niezależnie ustalić m i s. Zwykle łatwo jest wywnioskować, że m, ale często s wymagałoby wyraźnej adnotacji.

Co więcej, jest to o wiele bardziej ogólne niż potrzebujemy, więc zamiast tego możemy ograniczyć nasze typechecker do powiedzenia „Dla m, nie jest dokładnie 1 s”, w ten sposób, raz m jest wywnioskować, s jest oczywiste typu wnioskowania algorytm

+0

Nie mogę zrozumieć, w jaki sposób 'Dla m, istnieje dokładnie 1 s'. Jeśli powiemy, dla 'm' jest dokładnie jeden' ​​s', to dlaczego nie zapisać ich jako 'MonadSupply m m'? (Wiem, że brzmi to szaleńczo :)) – Sibi

+0

@Sibi Ponieważ 's' jest zwykle inny, na przykład z' MonadState', mamy 'StateT s' i' s', wyraźnie dla wszystkich 'StateT s' naprawdę po prostu chcę użyć 's'. – jozefg

+0

Dowolna podana "monada zasilająca" będzie zazwyczaj dostarczać tylko jeden typ! Na przykład, jeśli masz 'm = MySpecialSupplyMonad s', który dostarcza wartości typu' s', to wiesz z typu "' MySpecialSupplyMonad s' "typ źródła po prostu czytając argument typu" 's'". Zatem 's' można powiedzieć, że funkcjonalnie zależy od' m'. –

Powiązane problemy