Я действительно не могу получить это. Зачем нам это вообще нужно? Я имею в виду, если я использую один и тот же параметр типа, я думаю, это означает, что они должны быть одного типа.
Я слышал, это может помочь компилятору избежать бесконечного цикла. Может кто-нибудь рассказать мне об этом подробнее?
В конце концов, есть ли какие-то «шаблоны и практики», которым мы должны следовать при использовании функциональной зависимости в реальном мире 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'?