我正在学习Haskell并尝试理解Monoid类型类。 目前,我正在阅读haskellbook,它说下面的模式(monoid):
Haskell社区的一个重点就是它 在代码中识别抽象模式的倾向 数学中定义明确,合法的陈述。
作者对abstract patterns
的意思是什么?
答案 0 :(得分: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的最激动人心的部分之一,因为虽然大多数其他语言也允许你非常一般,但是他们大多会对这种普遍性的表达方式产生极大的影响,因此也不那么强大。 (这是因为他们谈论的内容不太准确,因为他们的类型不太好,而且定义为#34;)。
这就是我们如何推理可能的价值观"一个函数,它不仅限于Haskell。我们在类型级别编码的信息越多,我们转向的表达性谱的特定性越深。例如,采用经典案例,函数const :: a -> b -> a
。此函数要求a
和b
完全可以是任何类型,如果我们愿意,可以包括相同的类型。从那以后,因为第二个参数可以是与第一个不同的类型,我们可以知道它实际上只有一个可能的功能。它无法返回Int
,除非我们给予一个Int
作为其第一个值,因为它不是任何类型,对吗?因此,我们知道它可以返回的唯一值是第一个值!功能在类型中定义!如果那不是在冒充,那我就不知道是什么了。 :)
当我们转向依赖类型(即类型系统,其中类型是第一类,这也意味着普通值可以在类型系统中编码)时,我们可以越来越接近类型系统具体指定可能的功能的限制是什么。但是,除非我们想要,否则它并不一定会谈论功能的实现,因为我们已经控制它的抽象性,但是在维护时表现力和精确度。这非常有趣,而且非常强大。
很多数学可以用支持Haskell的语言来表达,即lambda演算。