haskell - Haskell中不同类型之间的关系
问题描述
据我了解,Haskell 中有 4 种“类型”:
- 代数数据类型
data
数据类型构造函数(类型中的后面是什么=
;data
技术上不是类型,我不认为)- 键入别名
type
- 类型类与
class
- 类型实例
instance
问题是:
- 如果 Haskell 中有更多种类的类型。如果有,有什么关系。
data
类型和类型类之间有什么区别class
。它们看起来很相似,但显然它们有一些不同的特征。与 (3) 相同。data
类型和instance
类型类实例之间有什么区别。
我是 Haskell 的新手。
解决方案
data
并newtype
引入新类型(或实际上是类型构造函数 -Maybe
不是类型,而是Maybe a
任何a
类型的类型)。
声明引入了一种data
新类型( 的左侧=
)和表示该类型数据的方法( 的右侧=
)。
例如,如果您有这样的数据声明:
data SomeType = SomeConstructor
然后,您介绍了一种名为 的新类型SomeType
,以及一种构造 的值的方法SomeType
,即构造函数SomeConstructor
(顺便说一句,它没有任何参数,因此是该类型的唯一值)。
类型类不做这些事情中的任何一件(a 也不做instance
)。类型类引入了一个约束和一堆多态函数,如果满足该约束,这些函数应该可用。通过为这些功能提供实现, Aninstance
基本上是在说“这种类型符合这个约束”。所以 aclass
并不是真正引入新类型,它只是为现有类型提供临时多态性的一种方式。
例如,Show
类型类大致是这样的:
class Show a where -- a is an instance of Show if
show :: a -> String -- it has a function called show with this signature
(请注意,实际的Show
类Prelude
并不像这样)
show
现在有类型Show a => a -> String
,你可以读为
对于所有 a,如果它们满足约束
Show
(或者,如果它们是 的实例Show
),这是一个接受 ana
并返回字符串的函数
这个例子看起来像这样
instance Show SomeType where
show SomeConstructor = "SomeConstructor"
意思是
SomeType
满足约束Show
,我将通过提供一个实现来向您展示如何show
这大概就是它的要点。有一些语言扩展允许类型类和实例发生更多涉及的事情,但您现在不需要担心这一点。
推荐阅读
- javascript - 从 URL 获取特定数据
- javascript - 如何在ajax调用或表单调用后保留使用Jquery所做的CSS更改
- javascript - Express 中的并发
- html - 如何用下拉菜单固定标题?
- c# - 使用在 ConfigureServices 期间注入的类实现选项模式 - AddScoped
- python - FiPy 的 stokesCavity 示例返回 False
- c# - 如何在 Xamarin MvvmCross 中实现权限请求?
- python - 如何在 sklearn 中对看不见的未来数据应用一种热编码
- java - Java:将 InOrder 遍历作为字符串返回到 JLabel
- paypal - PayPal Express Checkout 运输选项集成