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)
我发现自己做了很多.是否有一个标准的预定义运算符可以使这些代码更简洁,或者我需要自己定义一个?如果是后者,是否有传统名称?
是否有一个标准的预定义运算符,可以使这段代码更简洁......?
没有.
......或者我需要自己定义一个?
是(除非您要导入外部包).
如果是后者,是否有传统名称?
它被称为(??)镜头,有些还有其他名称.根据镜头,它是一个广义的变体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)