我是Haskell的新手。这可能是愚蠢的问题。
由于Applicative类型类具有 apply 函数,该函数在相同的上下文中使用这些函数和数据。为什么它不能与众不同,却更通用。
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
为什么我们不能写这样的东西
class Functor f => Applicative f where
(<*>) :: Functor g => g (a -> b) -> f a -> g (f b)
(<*>) gab fa = fmap (\g -> fmap g fa) gab
(<<*>>) :: Functor g => (g (f a) -> f a) -> g (a -> b) -> f a -> f b
(<<*>>) peelOuter gab fa = peelOuter $ gab <*> fa
(>>*<<) :: Functor g => (g (f a) -> g a) -> g (a -> b) -> f a -> g b
(>>*<<) cleanInner gab fa = cleanInner $ gab <*> fa
它可以如下使用
-- Extract List from maybe
elfm :: Maybe [a] -> [a]
elfm Nothing = []
elfm (Just xs) = xs
-- Fuse List elements in Maybe []
flem :: Monoid a => Maybe [a] -> Maybe a
flem Nothing = mempty
flem (Just xs) = Just $ foldl (<>) mempty xs
Just (*2) <*> [1,2,3,4]
-- Just [2,4,6,8]
(<<*>>) elfm (Just (*2)) [1,4]
-- [2,8]
(>>*<<) flem (Just (++ "Haskell")) ["Hello,"]
-- Just "Hello,Haskell"
我读到,拥有Applicatives的全部要点是Functors提升多参数函数的缺点。是这样吗?
我认为功能应用程序不符合预期。
add :: Num a => a -> a -> a
add a b = a + b
-- I want to apply [1,3] as First arguments and [4,5,6] as 2nd arguments.
-- Like add 1 4,add 2 4,add 3 6
-- But it is give all possibilities of combinations like a tree
-- <*>
-- (+1) (+2) (+3)
-- (1+4)(1+5)(1+6) (2+4)(2+5)(2+6) (3+4)(3+5)(3+6)
还将它们与批处理进行比较,但没有给出非常真实的示例。请为此提供示例。