开发手册 欢迎您!
软件开发者资料库

Haskell - Functor

Haskell Functor - 从简单和简单的步骤学习Haskell,从基本到高级概念,包括概述,环境设置,基本数据模型,基本操作符,决策,类型和类型类,函数,更多函数,函数组合,模块,输入和输出,Functor,Monads,拉链。

Haskell中的

Functor 是一种可以映射的不同类型的功能表示.它是实现多态性的高级概念.根据Haskell开发人员的说法,所有类型如List,Map,Tree等都是Haskell Functor的实例.

A 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]的列表的相同结果.

这两个函数都称为另一个函数减去()得出结果.

  [1,3,7,15]  [1,3, 7,15]

那么,地图 fmap有什么区别?区别在于在他们的用法. Functor 使我们能够在不同的数据类型中实现更多功能主义者,例如"just"和"Nothing".

main = do    print (fmap  (+7)(Just 10))    print (fmap  (+7) Nothing)

上面的代码将在终端上产生以下输出 :

Just 17Nothing

Applicative Functor

Applicative Functor是一个普通的Functor,具有应用类型类提供的一些额外功能.

使用Functor,我们通常将现有函数映射到其中定义的另一个函数.但是没有任何方法可以将Functor中定义的函数映射到另一个Functor.这就是为什么我们有另一个名为 Applicative Functor 的设施.这种映射工具由 Control 模块下定义的Applicative Type类实现.这个类只给我们两种方法:一个是,另一个是< *> .

以下是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仿函数.我们的程序将产生以下输出.

 "Just 4"

Monoids

我们都知道Haskell以函数的形式定义了所有东西.在函数中,我们可以选择将输入作为函数的输出.这就是 Monoid 的原因.

A 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} 是幺半群的完美例子.