Haskell - 函子(Functor)

Haskell - 函子(Functor) 首页 / Haskell入门教程 / Haskell - 函子(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有什么区别?如" just"和" Nothing"。

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

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

Just 17
Nothing

应用函子

Applicative Functor是一个普通的Functor,具有Applicative Type Class提供的一些额外函数。

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

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

根据实现,我们可以使用两种方法映射另一个Functor:"Pure"和"<*>"。 “Pure"方法应采用任何类型的值,并且它将始终返回该值的应用函子。

以下示例显示了应用函子如何工作-

链接:https://www.learnfk.comhttps://www.learnfk.com/haskell/haskell-functor.html

来源:LearnFk无涯教程网

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的类型类定义。

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"相加,在这两种情况下,输出将与输入相同。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

硅谷产品实战36讲 -〔曲晓音〕

Go语言核心36讲 -〔郝林〕

Linux性能优化实战 -〔倪朋飞〕

高并发系统设计40问 -〔唐扬〕

苏杰的产品创新课 -〔苏杰〕

后端技术面试 38 讲 -〔李智慧〕

Serverless入门课 -〔蒲松洋(秦粤)〕

Tony Bai · Go语言第一课 -〔Tony Bai〕

结构写作力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)