使用Functors或其他类型类免费获得哪些功能?

use*_*184 11 haskell functor typeclass

我读了一篇文章说:

为许多标准类型类[Functors]提供实例将立即为您提供许多实际上免费的功能

我的问题是:你获得的免费功能(对于仿函数或其他类型类)是什么?我知道一个仿函数的定义是什么,但我该怎么得到免费的东西定义为仿/其他类型的类.除了更漂亮的语法之外的东西.理想情况下,这将是对仿函数/其他类型类进行操作的通用和有用函数.

自由意味着什么是这种功能的想象(可能是错误的): TypeClass x => useful x y = ..

==编辑/添加==

我想我主要是询问更抽象(和令人难以置信的)类型类,就像这张图片中的类型一样.对于像Ord这样不太抽象的类,我的面向对象直觉理解.

Tik*_*vis 9

函数很简单,可能不是最好的例子.让我们看看Monads:

  • liftM-如果事情是一个单子,它也是一个函子哪里liftMfmap.
  • >=>,<=<:你可以a -> m b免费撰写函数,m你的monad 在哪里.
  • foldM, mapM, filterM...你得到了一堆实用函数,可以概括现有函数来使用你的monad.
  • when,guard*和unless- 您还可以免费获得一些控制功能.
  • join- 这实际上是monad定义的基础,但是你不需要在Haskell中定义它,因为你已经定义了>>=.
  • 变形金刚 - ErrorT和东西.您可以将错误处理固定到您的新类型上,免费(赠送或取走)!

基本上,只要您将新类型设置为Monad实例,就可以"提升"各种标准函数.它也变得不那么重要(但可惜不是自动的),使之成为FunctorApplicative也.

然而,这些都是更一般的想法的"症状".您可以编写适用于所有 monad的有趣,重要的代码.您可能会发现您为类型编写的一些函数 - 无论出于何种原因,这些函数在您的特定情况下都很有用 - 可以推广到所有monad.现在你可以突然接受你的功能并在解析器,列表,maybes和...上使用它.

*正如Daniel Fischer所指出的那样,guard需要MonadPlus而不是Monad.

  • `guard`需要`MonadPlus`. (5认同)

sha*_*ang 5

函数本身并不是很有趣,但它们是进入应用函子的必要垫脚石Traversables.

使应用仿函数有用的主要特性是,您可以fmap与应用运算符<*>一起使用"提升"任何arity的任何功能以使用应用值.即你可以把任何一个a -> b -> c -> d变成Applicative f => f a -> f b -> f c -> f d.您还可以查看Data.TraversableData.Foldable包含几个涉及applicative functor的通用函数.

Alternative是一个专门的应用程序函子,支持可以"失败"的替代品之间的选择("空"的确切含义取决于应用实例).应用解析器是一个实际示例,其中定义somemany非常直观(例如,匹配某些模式零次或多次或一次或多次).

Monads是最有趣和最有用的类型类之一,但是其他答案已经很好地涵盖了它们.

Monoid是另一个既简单又立即有用的类型类.它基本上定义了一种将两个数据组合在一起的方法,然后concat在上述Foldable模块中为您提供通用和功能,并且它还使您能够使用Writer具有数据类型的monad.