每个类都不是Haskell中的类型:
Prelude> :t max
max :: Ord a => a -> a -> a
Prelude> :t Ord
<interactive>:1:1: Not in scope: data constructor ‘Ord’
Prelude>
Run Code Online (Sandbox Code Playgroud)
为什么这不是打印Ord类型签名?
Ben*_*Ben 12
好的,这里有几件事情要发生.
首先,当你写:t Ord你正在寻找一些所谓Ord的价值的命名空间; 特别是它必须是一个构造函数,因为名称以大写字母开头.
Haskell使类型和值完全分开; 类型名称与类型构造函数名称之间没有关系.通常,当只有一个构造函数时,人们将使用与该类型相同的名称.一个例子是data Foo = Foo Int.这声明了两个新的命名实体:类型Foo和构造函数Foo :: Int -> Foo.
把它想象成只能Foo在类型表达式和构造Foos中使用的类型并不是一个好主意.因为也很常见的是声明data Maybe a = Nothing | Just a.这里有2个不同的构造函数Maybe a,并且Maybe在值级别根本不是任何名称.
所以,仅仅因为你Ord在类型表达式中看到并不意味着Ord在值级别有一个名称,你可以询问类型:t.即使有,也不一定与类型级名称相关Ord.
需要澄清的第二点是,不,类实际上不是类型.类是一组类型(它们都支持类中定义的接口),但它本身不是类型.
在vanilla Haskell中,类型只是"额外"的东西.您可以使用声明声明它们,使用class声明实例化它们instance,并使用附加到类型(=>箭头左侧的内容)的特殊语法中的它们作为类型变量的约束.但它们并不真正与语言的其余部分进行交互,并且您不能在类型签名的主要部分中使用它们(`=>箭头的右侧).
但是,通过ConstraintKinds扩展,类型类确实成为类型命名空间中存在的普通事物,就像Maybe.它们仍然不是类型,因为永远不会有任何值将它们作为类型,因此您不能在函数中使用Ord或Ord Int作为参数或返回类型,或者具有[Ord a]或类似的任何类型.
因为它们有点像类型构造函数Maybe.Maybe是类型命名空间中绑定的名称,但它不是这样的类型 ; 没有类型只是的值Maybe,但Maybe可以用作定义类型的表达式的一部分,如Maybe Int.
如果你不熟悉种类,可能会忽略我从前面说过的一切ConstraintKinds; 你最终可能会了解种类,但它们并不是你作为初学者需要了解多少的功能.但是,如果你是ConstraintKinds一个特殊类型Constraint并且具有类型类约束(=>箭头的左侧)只是普通的类型级别的东西Constraint而不是特殊目的语法.这意味着这Ord是一个类型级别的东西,我们可以通过:kGHCI中的命令来询问它的类型:
Prelude> :k Ord
* -> Constraint
Run Code Online (Sandbox Code Playgroud)
这是有道理的; max有类型Ord a => a -> a -> a,所以Ord a一定要善良Constraint.如果Ord可以应用于普通类型以产生约束,则它必须具有类型* -> Constraint.
Ord不是一种类型; 这是一个类型类.类型类允许您将支持的操作与给定类型相关联(有点类似于Java中的接口或Objective-C中的协议).A型(例如Int)是一个一个类型类(例如"实例" Ord)指的是,类型支持的功能Ord类型类(例如compare,<,>等等).
您可以:i在ghci中获取有关类型类的大部分信息,它会显示与类型类关联的函数以及哪些类型是它的实例:
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’
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8570 次 |
| 最近记录: |