当前位置: > 财经>正文

类型和种类有什么区别? 外汇风险的定义与种类有哪些区别和联系

2023-09-10 17:27:24 互联网 未知 财经

类型和种类有什么区别?

在这里,“值”,“类型”和“种类”具有形式上的含义,因此,考虑它们的通用英语用法或对汽车进行分类的类比,只会使您到目前为止。

我的回答与在Haskell上下文中这些术语的形式含义有关。这些含义基于(尽管并不完全相同)数学/ CS“类型理论”中使用的含义。因此,这将不是一个很好的“计算机科学”答案,但是它可以作为一个很好的Haskell答案。

在Haskell(和其他语言)中,将一种类型分配给一个程序表达式是有帮助的,该程序表达式描述了允许该表达式具有的值的类别。我这里假设你已经看到了足够的例子来了解为什么它会是知道的是,在表达的sqrt (a**2 + b**2),变量a和b将永远是类型的值Double,而不是,说,String和Bool分别。基本上,拥有类型可以帮助我们编写可在各种值上正常工作的表达式/程序。

现在,您可能尚未意识到的是Haskell类型,例如出现在类型签名中的类型:

fmap :: Functor f => (a -> b) -> f a -> f b

实际上是用类型级别的Haskell子语言编写的。程序文本Functor f => (a -> b) -> f a -> f b-从字面上看-是用此子语言编写的类型表达式。子语言包括运营商(例如,->在该语言中的右结合缀运算符),变量(例如,f,a,和b)一种类型的表达,和“应用”到另一个(例如,f a被f施加到a)。

我是否提到在许多语言中为程序表达式分配类型以描述表达式值的类有什么帮助?好吧,在这种类型级别的子语言中,表达式对类型求值(而不是value),并且最终有助于将类型分配给类型表达式以描述允许它们表示的类型的类别。基本上,拥有种类可以帮助我们编写可在各种类型上正常工作的类型表达式。

因此,值对类型就像类型对种,类型帮助我们编写价值级别的程序,而类型则帮助我们编写类型级别的程序。

做这些种什么样子的?好吧,考虑类型签名:

id :: a -> a

如果类型表达式a -> a是有效的,什么样的的类型,我们应该允许变量a是?好了,类型表达式:

Int -> IntBool -> Bool

看起来有效,因此类型 Int和Bool显然是正确的类型。但更复杂的类型如:

[Double] -> [Double]Maybe [(Double,Int)] -> Maybe [(Double,Int)]

看起来很有效。实际上,由于我们应该能够调用id函数,甚至:

(a -> a) -> (a -> a)

看起来不错。所以Int,Bool,[Double],Maybe [(Double,Int)],和a -> a看起来都像类型正确的那种。

换句话说,似乎只有一种,我们称其*为Unix通配符,并且每种类型都有相同的种类 *,故事的结尾。

对?

好吧,不完全是。事实证明,Maybe就其本身而言,类型表达式与Maybe Int(完全一样sqrt,就其本身而言,与值表达式一样有效sqrt 25)一样有效。 但是,以下类型表达式无效:

Maybe -> Maybe

因为,虽然Maybe是一种类型的表达,它并不代表样的的类型,可以有值。所以,这就是我们应该如何定义*-这是样的的类型具有值; 它包括“完整”类型,例如Double,Maybe [(Double,Int)]但不包括不完整无价值的类型,例如Either String。为简单起见,我将这些类型的完整类型称为*“具体类型”,尽管该术语不是通用的,并且“具体类型”可能意味着与C ++程序员非常不同的东西。

现在,在类型表达式中a -> a,只要类型a具有种类 *(具体类型的种类),类型表达式的结果也a -> a将具有种类(即具体类型的种类)。 *

那么,什么样的的类型是Maybe?好了,Maybe可以应用于一种混凝土类型,以产生另一种混凝土类型。因此,Maybe看起来有点像一个类型级别的函数,该函数接受类型的类型 *并返回类型的类型 *。如果我们有这样的花了一个值水平函数值的类型 Int和返回值的类型 Int,我们想给它一个类型的签名Int -> Int,所以通过类比,我们应该给Maybe一个样的签名* -> *。GHCi同意:

> :kind MaybeMaybe :: * -> *

回到:

fmap :: Functor f => (a -> b) -> f a -> f b

在这种类型的签名,变量f有一种* -> *和变量a,并b有样*; 内置运算符->具有kind * -> * -> *(它*在左侧需要一个type,在右侧需要一个type,并且还返回一个type *)。从这个善良的推理规则,你可以推断出a -> b是一个有效的类型与种类*,f a并且f b也有效类型的一种*,并且(a -> b) -> f a -> f b是一种有效的类型*。

换句话说,编译器可以“类型检查”类型表达式(a -> b) -> f a -> f b以验证其对正确类型的变量是否有效,就像“类型检查” sqrt (a**2 + b**2)以验证其对正确类型的变量有效一样。

对“类型”和“种类”使用单独的术语的原因(即,不谈论“类型的类型”)主要是为了避免混淆。上面的种类看起来与类型完全不同,并且至少在一开始似乎表现出很大的不同。(例如,它需要一些时间来环绕,每一个“正常”的类型有同种想法你的头*和那种a -> b是*不是* -> *。)

其中一些也是历史性的。随着GHC Haskell的发展,值,类型和种类之间的区别开始变得模糊。如今,可以将值“提升”为类型,而类型和种类实际上是同一回事。因此,在现代的Haskell中,值(几乎)都具有类型和ARE类型,而类型的种类仅仅是

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。