Почему мы определяем функции в экземпляре? - PullRequest
0 голосов
/ 08 декабря 2018
instance Functor Maybe where
  -- fmap :: (a -> b) -> Maybe a -> Maybe b
  fmap f Nothing = Nothing
  fmap f (Just item) = Just (f item)

Если мы определяем fmap вне экземпляра, мы все равно можем применить его к Functor Maybe.Есть ли какая-то цель, которую мы определяем в данном случае?

1 Ответ

0 голосов
/ 08 декабря 2018

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

Так же, как + для целых и комплексных чисел (и матриц и т. Д.), Это две разные функции, так же как и fmap.«Концептуально» это то же самое, но то, что он на самом деле делает, отличается в каждом случае.

И если мы определим «fmap» вне экземпляра, мы не сможем переопределить его позже для другого типа - имя будетуже занят.Только методы классов типов позволяют нам использовать одно и то же имя для связанных, но разных операций для разных связанных, но разных типов.

...