繁体   English   中英

Haskell中不同类型之间的关系

[英]Relation Between the Different Types in Haskell

根据我的理解,Haskell中有4种“类型”:

  • 具有data代数数据类型
  • 数据类型构造函数(在data类型中的=之后=在技​​术上不是类型,我不认为)
  • 键入别名type
  • 类与class
  • instance键入instance

问题是:

  1. 如果Haskell中有更多种类型。 如果是这样,有什么关系。
  2. data类型和class类型类之间有什么区别。 它们看似相似,但显然它们有一些不同的特征。 与(3)相同。
  3. data类型和instance类型类实例之间的区别是什么。

我是Haskell的新手。

datanewtype引入新的类型(或类型构造实际上- Maybe不是一个类型的,但Maybe a是任何类型的a是一个类型)。

data声明引入了一种新类型( =的左侧)和表示该类型数据的方式( =的右侧)。

例如,如果您有这样的数据声明:

data SomeType = SomeConstructor

然后你引入了一个名为SomeType的新类型,以及一种构造SomeType值的SomeType ,即构造函数SomeConstructor (顺便SomeConstructor ,它没有任何参数,因此是唯一存在于此类型中的值)。

一个类型类没有做任何的这些事情(而且也没有一个instance )。 类型类引入了一个约束和一堆多态函数,如果满足该约束,它们应该是可用的。 instance基本上是通过为这些函数提供实现来说“此类型满足此约束”。 因此, class不是真正引入新类型,它只是为现有类型提供ad-hoc多态的一种方法。

例如, Show类型类大致是这样的:

class Show a where -- a is an instance of Show if
   show :: a -> String -- it has a function called show with this signature

(请注意,实际ShowPrelude并不完全是这样的)

show now的类型为Show a => a -> String ,您可以将其读作

所有人的,如果他们满足约束Show (或者,如果他们的实例Show ),这是一个函数,它的a并返回一个字符串

这样的实例看起来像这样

instance Show SomeType where
  show SomeConstructor = "SomeConstructor"

意思是

SomeType满足约束Show ,我将通过提供show的实现向您show

这大致是它的要点。 有一些语言扩展允许类型类和实例发生更多相关事情,但您现在不需要担心。

你可能听说过 ,它们是“类型的类型”在Haskell的。 类型是具有类型*东西,它表示可以具有值的东西:

> :kind Int
Int :: *
> :kind Char
Char :: *

类型构造函数是具有类型的东西* -> * ; 类型构造函数接受一种类型(某种类型* )并返回另一种类型。

> :kind Maybe
Maybe :: * -> *
> :kind []
[] :: * -> *

应用类型构造函数会为您提供一种新的类型*

> :kind Maybe Int
Maybe Int :: *
> :kind [] Float
[] Float :: *

(解析器允许[Foo]作为[] Foo的特例。)

还有其他类型的东西。 其中之一是Constraint ,您使用约束构造函数(也称为类型类)创建Constraint 给一个约束构造函数一个类型,然后你得到一个约束。

> :kind Show
Show :: * -> Constraint
> :kind Show Int
Show Int :: Constraint
> :kind Show (Int -> Char)
Show (Int -> Char) :: Constraint

(注意,即使没有定义Int -> Char实例,后者也是正确的。)


在这种情况下, =>看起来像一个运算符,而不仅仅是特殊的语法。 它的参数是约束的“列表”(尽管使用普遍量化的类型变量而不是具体类型)和类型,其返回值是“约束”类型(让我们假设除了** -> *之外还有一种类型的ConstrainedType * -> *Constraint )。

:t show
show :: Show a => a -> String

-- Taking extreme liberties with syntax
-- :k (=>)
-- (=>) :: [Constraint] -> * -> ConstrainedType
-- A section?
-- :k (Show a =>)
-- (Show a =>) :: * -> ConstrainedType
-- :k (Showa => * -> String)
-- Show a => a -> String :: ConstrainedType

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM