Jump to content

Функтор (функциональное программирование)

Применение fmap (+1) в двоичное дерево целых чисел увеличивает каждое целое число в дереве на единицу.

В функциональном программировании функтор это шаблон проектирования , вдохновленный определением из теории категорий , который позволяет применять функцию к значениям внутри универсального типа без изменения структуры универсального типа. В 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]

См. также [ править ]

Ссылки [ править ]

  1. ^ Йорги, Брент. «Функтор > Законы» . ХаскеллВики . Проверено 17 июня 2023 г.
  2. ^ «Функторы» . Функциональный жемчуг . Университет Мэриленда . Проверено 12 декабря 2022 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7dbd01410755d4a991c460ba180c816c__1694514360
URL1:https://arc.ask3.ru/arc/aa/7d/6c/7dbd01410755d4a991c460ba180c816c.html
Заголовок, (Title) документа по адресу, URL1:
Functor (functional programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)