2013-12-11 3 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

Замечательно писать код, не используя функциональные зависимости, это просто боль, потому что вывод отстой.

В принципе без FDs функция get :: MonadState m s => m s должна будет определить m и s самостоятельно. Обычно m довольно легко вывести, но часто s потребует явного аннотации.

Кроме того, это гораздо больше общего, чем нам нужно, так что вместо этого мы можем ограничиться проверки типов, чтобы сказать «Для m, существует ровно 1 s», таким образом, как только m выводится, s очевидно для вывода типа алгоритм

+0

Я не могу понять, как «Для m существует ровно 1 с». Если мы скажем, что для 'm' существует ровно один' '', то почему бы не написать их как 'MonadSupply m m'? (Я знаю, что я сумасшедший :)) – Sibi

+0

@Sibi Поскольку '' 'обычно отличается, например, с' MonadState', мы имеем 'StateT s' и' s', явно для всех 'StateT s' мы действительно просто хочу использовать 's'. – jozefg

+0

Любая «подающая монада» обычно будет поставлять только один тип! Например, если у вас есть 'm = MySpecialSupplyMonad s', который поставляет значения типа' s', то вы знаете из типа «MySpecialSupplyMonad s'» тип поставки, просто прочитав аргумент типа '' s'. Таким образом, 's' можно сказать, что функционально зависит от' m'. –

Смежные вопросы