Haskell 什么是抽象模式?

Haskell 什么是抽象模式?,haskell,Haskell,我正在学习Haskell并试图理解幺半群类型类。 目前,我正在阅读Haskell的书,书中提到了关于模式(幺半群)的以下内容: Haskell社区的一个优点是它的 在代码中识别抽象模式的倾向 数学中定义明确、合法的表述 作者所说的抽象模式是什么意思?从这个意义上讲,抽象是具体的反面。这可能是了解Haskell的关键因素之一 什么是具体的东西?哈斯克尔的大部分价值观都是具体的。例如'a'::Char。字母“a”是一个Char值,它是一个具体的值Char是一种具体类型。但是在1::Num a=>a中

我正在学习Haskell并试图理解幺半群类型类。 目前,我正在阅读Haskell的书,书中提到了关于模式(幺半群)的以下内容:

Haskell社区的一个优点是它的 在代码中识别抽象模式的倾向 数学中定义明确、合法的表述


作者所说的抽象模式是什么意思?

从这个意义上讲,抽象是具体的反面。这可能是了解Haskell的关键因素之一

什么是具体的东西?哈斯克尔的大部分价值观都是具体的。例如
'a'::Char
。字母“a”是一个Char值,它是一个具体的值
Char
是一种具体类型。但是在
1::Num a=>a
中,数字
1
实际上是任何类型的值,只要该类型具有
Num
typeclass规定为必需的函数集。这是一个抽象的价值!我们可以有抽象值、抽象类型,因此也可以有抽象函数。在编译程序时,Haskell编译器将选择一个特定的具体值来支持我们的所有需求

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

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

类型类可能是最好的例子
Monoid
Num
是类型类的示例。这些结构允许程序员在许多类型中使用类似函数的抽象,但只需定义一次。如果可以为所有类型定义函数,那么TypeClass允许我们在所有类型中使用相同的函数名。为什么这很重要或有用?嗯,如果我们能够识别一种模式,例如,所有数字,并且我们有一种机制来讨论语言本身中的所有数字,那么我们就可以编写一次处理所有数字的函数。这是一种抽象模式。你会注意到一些Haskeller对一个叫做范畴理论的数学分支很感兴趣。这个分支基本上是抽象模式的数学定义。将这种编码能力与其他语言的能力进行对比,在其他语言中,社区注意到的模式通常不那么严格,必须手动写出,并且不考虑其数学性质。遵循数学的美妙之处在于,通过使我们的语言更贴近数学,我们可以免费获得大量的东西

这是对这些基础知识的一个很好的解释,包括我帮助编写的一本书中的TypeClass:

因为函数是以一种非常通用的方式编写的(因为Haskell几乎没有限制我们表达事物的能力),所以我们可以编写使用类型的函数,这些类型表示“任何类型,只要它是
幺半群”
”。如上所述,这些被称为类型约束

一般来说,抽象是非常有用的,因为我们可以,例如,在单个函数上编写操作整个类型范围的函数,这意味着如果我们只是将函数作为特定类型类的实例,我们通常可以找到对类型执行所需操作的函数。
Ord
typeclass就是一个很好的例子。将一个我们自己定义的类型作为
Ord
的一个实例,可以免费为我们提供一整套排序和比较功能

在我看来,这是Haskell最令人兴奋的部分之一,因为虽然大多数其他语言也允许你非常笼统,但它们大多在表达能力上有极端的倾向,因此也没有那么强大。(这是因为他们谈论的内容不够精确,因为他们的类型“定义”不太明确)

这就是我们如何对函数的“可能值”进行推理的方法,而不仅仅限于Haskell。我们在类型级别编码的信息越多,我们就越倾向于表达谱的特异性端。例如,举一个典型的例子,函数
const::a->b->a
。此函数要求
a
b
可以是任何类型,如果我们愿意,包括相同类型。因此,因为第二个参数可以是与第一个不同的类型,我们可以得出它实际上只有一个可能的功能。它不能返回一个
Int
,除非我们给它一个
Int
作为它的第一个值,因为这不是任何类型,对吗?因此,我们知道它能返回的唯一值是第一个值!功能就在类型中定义!如果这不是头脑发热,那么我不知道是什么。:)

当我们转向依赖类型(即类型是第一类的类型系统,这也意味着普通值可以在类型系统中编码)时,我们可以越来越接近让类型系统具体指定可能功能的约束。然而,关键是,除非我们愿意,否则它不一定涉及功能的实现,因为我们可以控制它的抽象程度,但同时保持表达性和精确性。这是非常迷人的,令人惊讶的强大

许多数学可以用支撑数学的语言来表达