Мы определяем экземпляр класса типов Functor
для любого типа, который мы хотим (что имеет смысл), и затем мы можем использовать функцию с одноименным названием "fmap
" для любого из этих типов.Фактическая функция будет отличаться в каждом случае, в соответствии с фактической реализацией типа (он же "instance
") класса типов (здесь Functor
) методов (здесь только один метод,по имени fmap
).
Так же, как +
для целых и комплексных чисел (и матриц и т. Д.), Это две разные функции, так же как и fmap
.«Концептуально» это то же самое, но то, что он на самом деле делает, отличается в каждом случае.
И если мы определим «fmap» вне экземпляра, мы не сможем переопределить его позже для другого типа - имя будетуже занят.Только методы классов типов позволяют нам использовать одно и то же имя для связанных, но разных операций для разных связанных, но разных типов.