Functor( Functor)
Haskell中的Functor是一种可以映射的不同类型的函数表示。 它是实现多态性的高级概念。 根据Haskell开发人员的说法,所有类型如List,Map,Tree等都是Haskell Functor的实例。
Functor是一个内置类,其函数定义如下 -
class Functor f where
fmap :: (a -> b) -> f a -> f b
通过这个定义,我们可以得出结论, Functor是一个函数,它接受一个函数,比如fmap()并返回另一个函数。 在上面的例子中, fmap()是函数map()的通用表示。
在下面的示例中,我们将看到Haskell Functor的工作原理。
main = do
print(map (subtract 1) [2,4,8,16])
print(fmap (subtract 1) [2,4,8,16])
这里,我们在列表中使用map()和fmap()进行减法运算。 您可以观察到两个语句将产生包含元素[1,3,7,15]的列表的相同结果。
这两个函数都调用了另一个名为subtract()函数来产生结果。
[1,3,7,15]
[1,3,7,15]
那么, map和fmap? 不同之处在于它们的使用。 Functor使我们能够在不同的数据类型中实现更多的功能主义者,比如“just”和“Nothing”。
main = do
print (fmap (+7)(Just 10))
print (fmap (+7) Nothing)
上面的代码将在终端上产生以下输出 -
Just 17
Nothing
应用编织者
Applicative Functor是一个普通的Functor,具有Applicative Type类提供的一些额外功能。
使用Functor,我们通常将现有函数映射到其中定义的另一个函数。 但是没有任何方法可以将Functor中定义的函数映射到另一个Functor。 这就是为什么我们有另一个名为Applicative Functor 。 这种映射工具由Control模块下定义的Applicative Type类实现。 这个类只给我们两种方法:一个是pure ,另一个是《*》 。
以下是Applicative Functor的类定义。
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
根据实现,我们可以使用两种方法映射另一个Functor: "Pure"和"《*》" 。 “Pure”方法应该采用任何类型的值,它将始终返回该值的Applicative Functor。
以下示例显示了Applicative Functor的工作原理 -
import Control.Applicative
f1:: Int -> Int -> Int
f1 x y = 2*x+y
main = do
print(show $ f1 <$> (Just 1) <*> (Just 2) )
在这里,我们在函数f1的函数调用中实现了applicative functor。 我们的程序将产生以下输出。
"Just 4"
Monoids
我们都知道Haskell以函数的形式定义了所有东西。 在函数中,我们有选项将输入作为函数的输出。 这就像Monoid 。
Monoid是一组函数和运算符,其输出独立于其输入。 我们取一个函数(*)和一个整数(1)。 现在,无论输入是什么,其输出将仅保持相同的数字。 也就是说,如果将数字乘以1,您将获得相同的数字。
这是monoid的Type Class定义。
class Monoid m where
mempty :: m
mappend :: m -> m -> m
mconcat :: [m] -> m
mconcat = foldr mappend mempty
看一下下面的例子,了解在Haskell中使用Monoid。
multi:: Int->Int
multi x = x * 1
add :: Int->Int
add x = x + 0
main = do
print(multi 9)
print (add 7)
我们的代码将产生以下输出 -
9
7
这里,函数“multi”将输入乘以“1”。 类似地,函数“add”将输入添加为“0”。 在这两种情况下,输出将与输入相同。 因此,函数{(*),1}和{(+),0}是幺半群的完美例子。