Есть ли название для этой функции или шаблона? - программирование
Подтвердить что ты не робот

Есть ли название для этой функции или шаблона?

Вместо fmap, который применяет функцию к значению-в-функторе:

fmap :: Functor f => (a -> b) -> f a -> f b

Мне нужна была функция, где функтор имеет функцию, а значение равно:

thing :: Functor f => f (a -> b) -> a -> f b

но я не может найти один.

Что называется этим шаблоном, где я применяю функцию-в-функторе (или в приложении или в монаде) до простого значения?

Я уже реализовал это, я просто не совсем понимаю, что я сделал и почему в стандартных библиотеках не было такой функции.

4b9b3361

Ответ 1

Для этого вам не нужно Applicative; Functor будет прекрасно работать:

apply f x = fmap ($ x) f
-- or, expanded:
apply f x = fmap (\f' -> f' x) f

Интересно, что apply на самом деле является обобщением flip; lambdabot заменяет flip этим определением как одно из своих обобщений стандартного Haskell, так что возможное имя, хотя и запутанное.

Кстати, часто стоит попробовать Hayoo (который ищет в целом Hackage, в отличие от Hoogle), чтобы узнать, какие имена часто задают функция, и будь то в какой-либо общей упаковке. Поиск f (a -> b) -> a -> f b находит flipData.Functor.Syntax, из functors) и ($#) (из synthesizer) в качестве возможных имен. Тем не менее, я бы, вероятно, просто использовал fmap ($ arg) f на используемом сайте.

Ответ 2

Как говорит Никлас, это приложение в некотором прикладном функторе к поднятому значению.

\f a -> f <*> pure a

:: Applicative f => f (a -> b) -> a -> f b

или более широко (?), используя Category (.)

\f a -> f . pure a

:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c