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