Mat*_*ick 16 haskell function typeclass
而不是fmap将函数应用于函数值:
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
我需要一个函数,其中函子有一个函数,值很简单:
thing :: Functor f => f (a -> b) -> a -> f b
Run Code Online (Sandbox Code Playgroud)
但我找不到一个.
这个模式叫做什么,我将函数函数(或者在应用程序中,或者在monad中)应用于普通值?
我已经实现了它,我只是不太明白我做了什么以及为什么标准库中还没有这样的功能.
ehi*_*ird 19
你不需要Applicative这个; Functor会做得很好:
apply f x = fmap ($ x) f
-- or, expanded:
apply f x = fmap (\f' -> f' x) f
Run Code Online (Sandbox Code Playgroud)
有趣的apply是,实际上是一种概括flip; lambdabotflip将此定义替换为标准Haskell的一个概括,因此这是一个可能的名称,尽管令人困惑.
顺便说一下,经常值得尝试的是Hayoo(它搜索整个Hackage,与Hoogle不同)来查看函数的名称,以及它是否在任何通用包中.在搜索时f (a -> b) -> a -> f b,它会找到flip(Data.Functor.Syntax从functors包中)和($#)(从synthesizer包中)作为可能的名称.不过,我可能只是fmap ($ arg) f在使用网站上使用.
正如尼克拉斯所说,这是应用于一些应用函子,以提升价值.
\f a -> f <*> pure a
:: Applicative f => f (a -> b) -> a -> f b
Run Code Online (Sandbox Code Playgroud)
或更一般地(?),使用Category (.)
\f a -> f . pure a
:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c
Run Code Online (Sandbox Code Playgroud)