Есть ли название для этой функции или шаблона?
Вместо fmap
, который применяет функцию к значению-в-функторе:
fmap :: Functor f => (a -> b) -> f a -> f b
Мне нужна была функция, где функтор имеет функцию, а значение равно:
thing :: Functor f => f (a -> b) -> a -> f b
но я не может найти один.
Что называется этим шаблоном, где я применяю функцию-в-функторе (или в приложении или в монаде) до простого значения?
Я уже реализовал это, я просто не совсем понимаю, что я сделал и почему в стандартных библиотеках не было такой функции.
Ответы
Ответ 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
находит flip
(в Data.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