jhe*_*dus 8 haskell terminology
我正在读这本书:Haskell表达学派和第56页,在第5章的开头,我读到了术语"多态数据类型"和"多态类型".
这两个术语是指同一个概念吗?
他们是同义词吗?
或者这两者有什么区别?如果有,那是什么?
pig*_*ker 21
一个类型(在Haskell中)是一段语法,可以有意义::地对表达式左侧的表达式进行分类::.一个类型的每个语法成分本身分类由种类,其中所述种类型(其分类表达式)是*.有些人很乐意使用"type"这个词来引用类型语法的任何组件,无论它是否允许它对表达式进行分类.
类型的语法可以通过各种声明形式进行扩展.
type Foo x y z = [x] -> IO (y, z),增加了键入完全应用形式的组分Foo X  Ÿ  Ž,这扩大宏观方式根据它们的定义式.data Goo x y z = ThisGoo x | ThatGoo (Goo y z x)引入了一种新类型构造符号Goo到的类型的语法,其被用于建立该分类由所产生的值的类型的数据构造,在这里ThisGoo和ThatGoo.newtype Noo x y z = MkNoo (x, [y], z)使得现有类型,它是由类型语法原始分辨的副本.如果类型包含可以用其他类型组件替换的类型变量,则该类型是多态的:按多态类型分类的值可以专用于类型变量的任何替换实例.例如,append 适用于其元素具有相同类型的列表,但任何类型都可以.具有多态类型的值通常被称为"多态值".(++) :: [a] -> [a] -> [a]
有时,"数据类型"用于表示由data声明引入的类型.从这个意义上讲,所有数据类型都是类型,但并非所有类型都是数据类型.非数据类型的类型示例包括IO ()和Int -> Int.此外,Int在这个意义上,它不是一种数据类型:它是一种硬连线原始类型.为避免疑问,有些人将这些类型称为代数数据类型,因为构造函数给出了代数,意思是"通过组合其他值来构建值的一堆操作"."多态数据类型"是其中包含类型变量的数据类型,例如[(a, Bool)]与之形成对比[Int].有时人们谈论"声明多态数据类型"或者说"像是Maybe多态数据类型"之类的东西,当它们真的只是意味着类型构造函数具有参数(并因此可以用于形成多态类型)时:迂腐地,人们会声明多态数据类型,但不是任何旧的多态数据类型,而是应用于形式参数的类型构造函数).
当然,按类型分类的所有第一类值在某种意义上都是"数据",而在Haskell中,类型不用于对任何不属于第一类值的东西进行分类,因此在较宽松的意义上,每个"类型"都是一个"数据类型".在除了具有类型的数据之外的东西(例如,Java中的方法)的语言中,区别变得更有意义.
非正式使用通常位于中间,而且定义不明确.人们经常在功能或过程与它们运行的东西("数据")之间进行某种区分.或者他们可能会认为数据是"根据他们制作的方式理解"(并通过模式匹配来揭示他们的表现形式),而不是"根据他们使用的方式理解".最后一次使用"数据"对于抽象数据类型的概念有点不舒服,这是一种隐藏底层东西表示的类型.因此,表示隐藏抽象数据类型与表示暴露代数数据类型的对比相当强烈,这就是为什么"ADT"被随意地用作两者的缩写是相当不幸的.
我担心,结果是模糊的.
| 归档时间: | 
 | 
| 查看次数: | 789 次 | 
| 最近记录: |