use*_*184 11 haskell functor typeclass
我读了一篇文章说:
为许多标准类型类[Functors]提供实例将立即为您提供许多实际上免费的功能
我的问题是:你获得的免费功能(对于仿函数或其他类型类)是什么?我知道一个仿函数的定义是什么,但我该怎么得到免费的东西定义为仿/其他类型的类.除了更漂亮的语法之外的东西.理想情况下,这将是对仿函数/其他类型类进行操作的通用和有用函数.
自由意味着什么是这种功能的想象(可能是错误的): TypeClass x => useful x y = ..
==编辑/添加==
我想我主要是询问更抽象(和令人难以置信的)类型类,就像这张图片中的类型一样.对于像Ord这样不太抽象的类,我的面向对象直觉理解.
函数很简单,可能不是最好的例子.让我们看看Monads:
liftM-如果事情是一个单子,它也是一个函子哪里liftM是fmap.>=>,<=<:你可以a -> m b免费撰写函数,m你的monad 在哪里.foldM, mapM, filterM...你得到了一堆实用函数,可以概括现有函数来使用你的monad.when,guardunless- 您还可以免费获得一些控制功能.join- 这实际上是monad定义的基础,但是你不需要在Haskell中定义它,因为你已经定义了>>=.ErrorT和东西.您可以将错误处理固定到您的新类型上,免费(赠送或取走)!基本上,只要您将新类型设置为Monad实例,就可以"提升"各种标准函数.它也变得不那么重要(但可惜不是自动的),使之成为Functor和Applicative也.
然而,这些都是更一般的想法的"症状".您可以编写适用于所有 monad的有趣,重要的代码.您可能会发现您为类型编写的一些函数 - 无论出于何种原因,这些函数在您的特定情况下都很有用 - 可以推广到所有monad.现在你可以突然接受你的功能并在解析器,列表,maybes和...上使用它.
*正如Daniel Fischer所指出的那样,guard需要MonadPlus而不是Monad.
函数本身并不是很有趣,但它们是进入应用函子的必要垫脚石Traversables.
使应用仿函数有用的主要特性是,您可以fmap与应用运算符<*>一起使用"提升"任何arity的任何功能以使用应用值.即你可以把任何一个a -> b -> c -> d变成Applicative f => f a -> f b -> f c -> f d.您还可以查看Data.Traversable并Data.Foldable包含几个涉及applicative functor的通用函数.
Alternative是一个专门的应用程序函子,支持可以"失败"的替代品之间的选择("空"的确切含义取决于应用实例).应用解析器是一个实际示例,其中定义some和many非常直观(例如,匹配某些模式零次或多次或一次或多次).
Monads是最有趣和最有用的类型类之一,但是其他答案已经很好地涵盖了它们.
Monoid是另一个既简单又立即有用的类型类.它基本上定义了一种将两个数据组合在一起的方法,然后concat在上述Foldable模块中为您提供通用和功能,并且它还使您能够使用Writer具有数据类型的monad.
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |