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"
众所周知,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"相加,在这两种情况下,输出将与输入相同。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
Tony Bai · Go语言第一课 -〔Tony Bai〕