什么是抽象模式?

zer*_*ing 3 haskell

我正在学习Haskell并尝试理解Monoid类型类.目前,我正在阅读haskellbook,它说下面的模式(monoid):

Haskell社区的一个重点是它倾向于识别代码中的抽象模式,这些抽象模式在数学中具有明确定义的合法表示.

作者的意思是abstract patterns什么?

Jul*_*ton 6

这种意义上的摘要与具体相反.这可能是了解Haskell的关键事项之一.

什么是具体的东西?好吧,Haskell中的大多数值都是具体的.例如'a' :: Char.字母'a'是Char值,它是具体的值.Char是一种具体的类型.但是1 :: Num a => a,数字1实际上是任何类型的值,只要该类型具有Num类型类设置为必需的函数集.这是一个抽象的价值!我们可以有抽象值,抽象类型,因此有抽象函数.编译程序时,Haskell编译器将选择一个支持我们所有需求的特定具体值.

Haskell的核心是一种非常简单,小巧但非常灵活的语言.实际上,它与数学的表达非常相似.这使它非常强大.为什么?因为在其他语言中用语言构造构建的大多数东西都没有直接构建到Haskell中,而是根据这个简单的核心来定义.

其中一个核心部分是函数,事实证明,大多数计算都是可以表达的.因为Haskell的大部分只是根据这个小的简单核心来定义,这意味着我们可以将它扩展到我们可以想象的任何地方.

类型可能是最好的例子.Monoid,Num是类型的例子.这些构造允许程序员在许多类型中使用类似函数的抽象,但只需要定义一次.如果我们可以为这些类型定义那些函数,则类型类允许我们在整个类型中使用相同的函数名.为什么这很重要或有用?好吧,如果我们能够识别一个模式,例如,所有数字,并且我们有一个机制来讨论语言本身中的所有数字,那么我们可以编写同时使用所有数字的函数.这是一种抽象的模式.你会注意到一些Haskeller对数学分支称为类别理论非常感兴趣.这个分支几乎是抽象模式的数学定义.将此类事物编码的能力与其他语言的无法对比,在其他语言中,社区注意的模式通常不那么严格,必须手动写出,并且不考虑其数学性质.追随数学的美妙之处在于,通过使我们的语言与数学更接近,我们可以免费获得大量的东西.

这是对这些基础知识的一个很好的解释,包括我帮助创作的一本书中的类型类:http://www.happylearnhaskelltutorial.com/1/output_other_things.html

因为函数是以非常通用的方式编写的(因为Haskell对我们通常表达事物的能力几乎没有任何限制),我们可以编写使用表达诸如"任何类型,只要它是Monoid"的事物类型的函数.这些被称为类型约束,如上所述.

通常抽象是非常有用的,因为我们可以,例如,在单个函数上编写以操作整个范围的类型,这意味着如果我们只是使它们成为特定类型类的实例,我们通常可以找到完全符合我们想要的类型的函数.该Ord类型类就是一个很好的例子.制作一个类型我们自己定义一个实例,Ord为我们提供了一大堆免费的排序和比较功能.

在我看来,这是关于Haskell的最令人兴奋的部分之一,因为虽然大多数其他语言也允许你非常一般,但它们大多在你的表达方式上有一个极端的倾向,所以因此也少强大.(这是因为他们谈论的内容不太准确,因为他们的类型不太"定义").

这就是我们如何能够推断函数的"可能值",并且它不仅限于Haskell.我们在类型级别编码的信息越多,我们转向的表达性谱的特定性越深.例如,采取经典案例,功能const :: a -> b -> a.这个功能需要它,a并且b可以完全是任何类型,如果我们愿意,包括相同的类型.从那以后,因为第二个参数可以是与第一个参数不同的类型,我们可以知道它实际上只有一个可能的功能.它不能返回Int,除非我们给它一个Int第一个值,因为那不是任何类型,对吧?因此,我们知道它可以返回的唯一值是第一个值!功能在类型中定义!如果这不是令人费解,那么我不知道是什么.:)

当我们转向依赖类型(即类型系统,其中类型是第一类,这也意味着普通值可以在类型系统中编码)时,我们可以越来越接近使类型系统具体指定约束可能的功能是.然而,踢球者,除非我们想要它,否则它不一定谈论功能的实现,因为我们控制它的抽象程度,但同时保持表达性和高精度.这非常吸引人,而且非常强大.

很多数学可以用支持Haskell(lambda演算)的语言来表达.