Функциональная зависимость в Haskell

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

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

В конце концов, есть ли какие-то «шаблоны и практики», которым мы должны следовать при использовании функциональной зависимости в Real World 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»?

8
задан Don Stewart 9 May 2011 в 01:58
поделиться