当前位置: 首页 > 文档资料 > Haskell 中文教程 >

Functor( Functor)

优质
小牛编辑
129浏览
2023-12-01

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]

那么, mapfmap? 不同之处在于它们的使用。 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}是幺半群的完美例子。

最后更新:

类似资料

  • 问题内容: 我想用Java定义Functor类。这有效: 但是,fmap的返回值应该不是,而是适当的子类。通常,可以使用CRTP对此进行编码,但是由于附加参数,在这里我似乎遇到了麻烦。例如,以下和类似的编码不起作用(“类型参数FInst不在其范围内”): [说明] 对于“适当的子类”,我指的是被称为自身的类的类型。例如,列表是函子,所以我想写一些类似的东西 我知道即使使用给出的第一个定义,我也可以

  • Haskell中的函子是一种可以映射不同类型的函数表示。它是实现多态性的高级概念。根据Haskell开发人员,列表、映射、树等所有类型都是Haskell函数的实例。 函子是一个内建的类,它的函数定义类似 − 根据这个定义,可以得出这样的结论:Functor是一个函数,它接受一个函数,比如,然后返回另一个函数。在上面的例子中,是函数的一种通用表示。 在下面的示例中,我们将看到Haskell Func

  • 我有一种类型看起来是这样的: 和一个函数 我也试过 但是GHC说是不推荐使用的,这是一个坏主意,更严重的是,我得到: 我认为这是说约束实际上不能用我希望的方式将约束为,这是很明显的(因为有两个类型变量):-( 当然,这也是无效的,哈斯克尔 是否有类似的类型类我可以使用,或者我尝试使用类型类来实现“隐式规范化函数调用的结果”的功能是错误的?

  • Haskell有、和实例,这些实例是为标准库中的函数(特别是部分应用的类型)定义的,围绕函数组合构建的。 理解这些实例是一个很好的让人省心的练习,但我这里的问题是关于这些实例的实际用途。我很乐意听到人们使用这些代码的现实场景。

  • 这里的代码工作得很好。这可能 是真的 错误 应该如此 但不幸的是,我必须让它与旧的函数指针一起工作。我从不在实践中使用它们,我对它们也知之甚少。很明显,签名“布尔运算符()(整型 foo,整型柱线)”不容易转换为“bool(回调)(整型,整型)”。 我从gcc获得的错误代码: 有办法解决吗?顺便说一下,我不介意有一个不同的解决方案。例如,bool参数可以通过使用::bind来传递,但是绑定也不起作