首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Ord类型?

什么是Ord类型?
EN

Stack Overflow用户
提问于 2015-07-23 21:37:41
回答 4查看 11.6K关注 0票数 8

是不是每个类都不是Haskell中的一个类型:

代码语言:javascript
复制
Prelude> :t max
max :: Ord a => a -> a -> a
Prelude> :t Ord

<interactive>:1:1: Not in scope: data constructor ‘Ord’
Prelude> 

为什么这不打印Ord类型签名?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-23 22:37:01

好吧,这里发生了几件事。

首先,当您编写:t Ord时,您要在命名空间中查找名为Ord的内容;具体来说,它必须是一个构造函数,因为名称以大写字母开头。

Haskell保持类型和值完全独立;类型的名称与类型的构造函数的名称之间没有关系。通常,当只有一个构造函数时,人们会使用与类型相同的名称。data Foo = Foo Int就是一个例子。这声明了两个新的命名实体:类型Foo和构造函数Foo :: Int -> Foo

把它看作是一个类型Foo,既可以用于类型表达式,也可以构造Foo,这并不是一个好主意,因为像data Maybe a = Nothing | Just a这样的声明也很常见。这里有两个不同的Maybe a构造函数,Maybe在值级别上根本不是任何东西的名称。

因此,仅仅因为您在类型表达式中看到了Ord,并不意味着在值级别上有一个名称Ord,您可以询问with :t的类型。即使存在,它也不一定与类型级别的名称Ord相关。

需要澄清的第二点是:不,类实际上不是类型。类是一组类型(它们都支持类中定义的接口),但它不是类型本身。

在香草Haskell类型中,类只是“额外”的东西。您可以使用class声明声明它们,用instance声明实例化它们,并将它们以附加到类型的特殊语法( =>箭头留下的内容)作为类型变量的约束。但是它们并不真正地与语言的其他部分交互,而且您不能在类型签名的主要部分( `=>箭头的内容权限)中使用它们。

但是,使用ConstraintKinds扩展,类型类确实成为类型命名空间中存在的普通事物,就像Maybe一样。它们仍然不是类型,因为永远不会有任何将它们作为类型的值,因此不能使用OrdOrd Int作为参数或函数中的返回类型,也不能使用[Ord a]或类似的类型。

在这一点上,它们有点像Maybe这样的类型构造函数。Maybe是类型命名空间中绑定的名称,但它不是类型本身;没有类型仅为Maybe的值,但Maybe可以用作定义类型的表达式的一部分,就像在Maybe Int中那样。

如果您不熟悉各种类型,那么可能忽略我从ConstraintKinds开始就说过的所有内容;您可能最终会了解到各种类型,但作为初学者,它们并不是您需要了解的特性。但是,如果您是这样的话,ConstraintKinds所做的就是创建一个特殊类型的Constraint,并具有类型类约束( =>箭头的左边)--只是普通类型级别的类Constraint,而不是特殊用途语法。这意味着Ord是一个类型级别的东西,我们可以问它对GHCI中的:k命令是否友好:

代码语言:javascript
复制
Prelude> :k Ord
* -> Constraint

这是有道理的;maxOrd a => a -> a -> a类型,所以Ord a必须有善良的Constraint。如果可以将Ord应用于普通类型以产生约束,则它必须具有类型的* -> Constraint

票数 12
EN

Stack Overflow用户

发布于 2015-07-23 21:48:28

Ord不是一种类型,而是一种类型。Typeclasses允许您将支持的操作与给定类型相关联(与Java中的接口或Objective中的协议有些类似)。类型(例如Int)是类型类型(例如Ord)的“实例”,意思是该类型支持Ord类型类型的功能(例如compare<>等)。

您可以在ghci中使用:i获取有关类型的大多数信息,这将向您展示与类型类型相关的函数以及哪些类型是它的实例:

代码语言:javascript
复制
ghci > :i Ord
class Eq a => Ord a where
  compare :: a -> a -> Ordering
  (<) :: a -> a -> Bool
  (>=) :: a -> a -> Bool
  (>) :: a -> a -> Bool
  (<=) :: a -> a -> Bool
  max :: a -> a -> a
  min :: a -> a -> a
    -- Defined in ‘GHC.Classes’
instance Ord a => Ord (Maybe a) -- Defined in ‘Data.Maybe’
instance (Ord a, Ord b) => Ord (Either a b)
  -- Defined in ‘Data.Either’
instance Ord Integer -- Defined in ‘integer-gmp:GHC.Integer.Type’
instance Ord a => Ord [a] -- Defined in ‘GHC.Classes’
...
票数 8
EN

Stack Overflow用户

发布于 2015-07-23 21:43:03

Ord不是一种类型,而是典型。它不是一种类型,而是一种

代码语言:javascript
复制
Prelude> :k Ord
Ord :: * -> Constraint

台风是哈斯克尔的奇妙之处之一。检查他们:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31598479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档