php functor,Haskell函子(functor)

Haskell中的函子是一种可以映射不同类型的函数表示。它是实现多态性的高级概念。根据Haskell开发人员,列表、映射、树等所有类型都是Haskell函数的实例。

函子是一个内建的类,它的函数定义类似 −

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

1. 应用函子

应用函子是一个正常的函子与一些额外的功能提供的应用 Type 类。

使用函子,我们通常将一个现有的函数与其中定义的另一个函数进行映射。但是没有任何方法可以将定义在函子内部的函数映射到另一个函子。这就是为什么要有另一个功能叫做应用函子(Applicative Functor)。这种映射功能由Control模块下定义的应用程序Type类实现。这个类只提供了两个方法:一个是纯方法,另一个是方法。

下面是应用函子的类定义。

class (Functor f) => Applicative f where pure :: a -> f a () :: f (a -> b) -> f a -> f b

根据实现,可以使用“纯”和“”两种方法来映射另一个函子。“纯”方法应该接受任何类型的值,并且总是返回该值的应用函式。

下面的例子说明了应用函子的工作原理:

import Control.Applicative f1:: Int -> Int -> Int f1 x y = 2*x+y main = do print(show $ f1 (Just 1) (Just 2) )

这里,在函数f1的函数调用中实现了应用函数。程序将产生以下输出:

"Just 4"

2. Monoids

众所周知,Haskell以函数形式定义了所有内容。在函数中,可以选择将输入作为函数的输出,这就是Monoid。

Monoid是一组函数和运算符,其中输出与其输入无关。我们以一个函数(*)和一个整数(1)为例。无论输入是什么,输出将仅保持相同的数字。也就是说,如果将数字乘以1,也将得到相同的数字。

下面是Monoid的Type类定义。

class Monoid m where mempty :: m mappend :: m -> m -> m mconcat :: [m] -> m mconcat = foldr mappend mempty

请看下面的示例,以了解Monoid在Haskell中的使用。

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}是monoids的例子。

¥ 我要打赏   纠错/补充 收藏

: :

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值