预定义的Haskell运算符用于在Applicative中应用纯值?

Jul*_*les 1 haskell operators applicative

如果我有一个包含在一个函数(例如类型a -> b)Applicative和一个可以应用于它的值(即a上例中的类型值),我可以按如下方式应用它:

doSomething :: Applicative f => f (a -> b) -> a -> f b
doSomething wrappedFn arg = wrappedFn <*> (pure arg)
Run Code Online (Sandbox Code Playgroud)

我发现自己做了很多.是否有一个标准的预定义运算符可以使这些代码更简洁,或者我需要自己定义一个?如果是后者,是否有传统名称?

Zet*_*eta 6

是否有一个标准的预定义运算符,可以使这段代码更简洁......?

没有.

......或者我需要自己定义一个?

是(除非您要导入外部包).

如果是后者,是否有传统名称?

它被称为(??)镜头,有些还有其他名称.根据镜头,它是一个广义的变体flip,这是有道理的:

flip ::             (a -> b -> c) -> b -> a -> c
(??) :: Functor f => f   (b -> c) -> b -> f c
Run Code Online (Sandbox Code Playgroud)

替换f((->) a,你会得到flip(??).因此,你可以称之为广义翻转.

顺便说一句,你不需要Applicative.Functor足够:

gFlip :: Functor f => f (a -> b) -> a -> f b
gFlip f x = fmap ($x) f
Run Code Online (Sandbox Code Playgroud)

一些例子:

ghci> gFlip [(+ 1),(* 2)] 2
[3, 4]
ghci> gFlip (++) "world" "hello"
"helloworld"
Run Code Online (Sandbox Code Playgroud)