Функтор (функциональное программирование)
В функциональном программировании функтор — это шаблон проектирования , вдохновленный определением из теории категорий , который позволяет применять функцию к значениям внутри универсального типа без изменения структуры универсального типа. В Haskell эту идею можно отразить в классе типов :
class Functor f where
fmap :: (a -> b) -> f a -> f b
В этом объявлении говорится, что любой тип функтора должен поддерживать метод. fmap
, который отображает функцию на элемент(ы) функтора.
Функторы в Haskell также должны подчиняться законам функторов . [1] которые утверждают, что операция отображения сохраняет тождественную функцию и состав функций:
fmap id = id
fmap (g . h) = (fmap g) . (fmap h)
(где .
означает композицию функций ).
В Scala : черту можно использовать
trait Functor[F[_]] {
def map[A,B](a: F[A])(f: A => B): F[B]
}
Функторы образуют основу для более сложных абстракций, таких как Applicative Functor , Monad и Comonad , каждая из которых построена на основе канонической структуры функтора. Функторы полезны при моделировании функциональных эффектов значениями параметризованных типов данных. Модифицируемые вычисления моделируются путем применения чистой функции к значениям «внутреннего» типа, создавая таким образом новое общее значение, которое представляет измененное вычисление (которое, возможно, еще предстоит запустить).
Примеры [ править ]
В Haskell списки являются простым примером функтора. Мы можем реализовать fmap
как
fmap f [] = []
fmap f (x:xs) = (f x) : fmap f xs
Бинарное дерево можно аналогичным образом описать как функтор:
data Tree a = Leaf | Node a (Tree a) (Tree a)
instance Functor Tree where
fmap f Leaf = Leaf
fmap f (Node x l r) = Node (f x) (fmap f l) (fmap f r)
Если у нас есть двоичное дерево tr :: Tree a
и функция f :: a -> b
, функция fmap f tr
будет применяться f
каждому элементу tr
. Например, если a
является Int
, добавляя 1 к каждому элементу tr
может быть выражено как fmap (+ 1) tr
. [2]
См. также [ править ]
- Функтор в теории категорий
- Аппликативный функтор — особый тип функтора.
Ссылки [ править ]
- ^ Йорги, Брент. «Функтор > Законы» . ХаскеллВики . Проверено 17 июня 2023 г.
- ^ «Функторы» . Функциональный жемчуг . Университет Мэриленда . Проверено 12 декабря 2022 г.