Функциональная зависимость в Haskell - PullRequest
8 голосов
/ 25 ноября 2010

Я действительно не могу получить это. Зачем нам это вообще нужно? Я имею в виду, если я использую один и тот же параметр типа, я думаю, это означает, что они должны быть одного типа.

Я слышал, это может помочь компилятору избежать бесконечного цикла. Может кто-нибудь рассказать мне об этом подробнее?

В конце концов, есть ли какие-то «шаблоны и практики», которым мы должны следовать при использовании функциональной зависимости в реальном мире Haskell?

[Дополнительный вопрос]

class Extract container element where
  extract :: container -> element

instance Extract (a,b) a where
  extract (x,_) = x

В приведенном выше коде я использовал одну и ту же переменную типа «a» как для контейнера, так и для элемента. Я думаю, что компилятор может сделать вывод, что эти два типа имеют один и тот же тип.

Но когда я попробовал этот код в GHCi, я получил следующий отзыв:

*Main> extract('x',3)
<interactive>:1:0:
    No instance for (Extract (Char, t) element)
      arising from a use of `extract' at <interactive>:1:0-13
    Possible fix:
      add an instance declaration for (Extract (Char, t) element)
    In the expression: extract ('x', 3)
    In the definition of `it': it = extract ('x', 3)

Когда один из них был определен как тип 'Char', почему другой все еще остается неразрешенным, тип 'element'?

1 Ответ

7 голосов
/ 25 ноября 2010

Я думал, что это объясняет это довольно хорошо. Таким образом, в основном, если у вас есть отношение FD a -> b, все это означает, что для класса типов instance может быть только один 'b' с любым 'a', поэтому Int Int, но вы не можете иметь Int Float, а также. Вот что они имеют в виду, когда говорят, что «б» однозначно определяется из «а». Это распространяется на любое количество параметров типа. Причина, по которой это необходимо - 1. Вывод типа 2. Иногда вам нужно подобное ограничение.

Альтернативой FD является расширение семейств типов, но не для всех случаев FD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...