编程语言中有趣或独特的类型?[关闭]


20

我们都看到过整数,浮点数,字符串和偶数十进制类型。您遇到过的最奇怪,独特或有用的类型有哪些?


嗨,user10008,欢迎来到Programmers.SE!您是否已查看我们的常见问题解答?您认为您的问题符合六个主观准则中的哪一个?

4
有人愿意为Lisp撰写条目吗?
马克C

我想这可能是一个傻瓜,但只是因为我的回答会是一个傻瓜,所以我会发布一个链接,也许你会找到一些很好的答案:programmers.stackexchange.com/questions/724/...
彼得特纳

@Mark:我试过了,但是类型可能是Lisp最不有趣的事情之一。
拉里·科尔曼

@LarryC我认为这对Lisp是一个完美的问题,因为列表的使用无处不在!这些列表构成了语法树,这使您可以编写对我的代码做奇妙事情的函数。我现在正在学习球拍(以前是PLT Scheme)。Lisp是我真正受到激励并且有兴趣学习的唯一编程语言。
Mark C

Answers:


18

我会简短:

Maybe a

在Haskell。

通过这种简单的结构,该语言解决了崩溃问题,或者NullPointerException巧妙地避开了Tony Hoare的“百万错误” :)

坦白说,在编译时检查了一个可选的存在吗?像梦一样...


1
Option,在许多其他编程语言中都这样称呼。
乔纳斯(Jonas)

@乔纳斯:我必须承认我不喜欢这个Option名字。为什么不Optional呢!可能是因为我不是母语人士,但Option没有向我传达“可选”的意思。
Matthieu M.

这个Maybe名字很可爱:“你有什么?” “也许是一个int”。但是,真正巧妙的一点是,它既是函子又是单子函数,用简单的方式来说,这意味着您可以免费获得零传播。您无需在函数内部或代码中间放置null检查。您只需要在代码的最后检查它(如果有的话)。
蒂洪


15

我常年喜欢void *。这可能是我内心深处有缺陷的症状。


2
是。恐怕就是这样。:)哦,+1代表“有趣”,而不是“独特”。Objective-C显然有,void *而Pascal / Delphi则有Pointer
Frank Shearar 2011年

哈哈更多是非类型的,但您不能说它不强大
user10008 2011年

15
我只是喜欢它所表达的内在悲观情绪:“你能看到那东西吗?” “是的,这是什么?”,“不知道。”
biziclop 2011年

我一直觉得很有趣,虽然您不能声明一个空值,但是可以使用它的地址。在我看来,用struct s {int A; 无效B; int C; } B的地址应该是A和C之间的裂缝的地址。但是不可以,这是不允许的。
安迪·坎菲尔德

这就是为什么在Pascal中“指针”用于表示通用指针,而不与“过程”混淆。
umlcat 2011年

14

Lua的内置桌子令人印象深刻。它具有内置的哈希表和向量,并且使用元表可以成为过程语言中面向对象编程的基本基础。

表的每个索引都可以接收任何基本语言结构(数字,布尔值,字符串,函数-是,函数是lua上的类型-和表)。


请注意,如何以非常相似的方式来构建Javascript,而Python可能是基于Ruby来基于相同的基础来构建。
9000

我认为这在Perl和PHP中也是可能的,是吗?
FrustratedWithFormsDesigner

lua中的表与其他语言中的哈希容器之间存在差异。lua散列值的分配方式存在细微的实现差异,这使得其表以几乎不可思议的方式工作。我主要使用python编程,有时基于对lua表工作方式的期望,发现我使用的假设不成立。此魔术的一个特定示例是整数对自身散列+1。这意味着整数键被密集压缩,并且+0.0和-0.0具有相同的散列(它们相等)
SingleNegationElimination




6

Fortran具有常见的功能块;它是现代语言中最不常见的数据类型之一,或者说是一种有效共享数据的不寻常方式。

Fortran 95具有间隔类型和内置的间隔算法。

没有在Haskell中找到的单子类型,该列表将不完整。要了解它们,您需要付出一些努力。


嗯,UniData / UniVerse数据库在其内部语言(UniBasic)中也具有通用块。
Dan McGrath

公共块是程序的不同部分使用的代码块吗?
Mark C

1
@MarkC IIRC基本上是全局数据,但是要访问的每个函数都必须明确表示将到达顶部
jk。


4

我想这实际上只是来自于经典体系结构编程的一种奇怪现象,但是对于我来说,最难缠的最难理解的类型之一就是量子寄存器,它出现在QCL中


3

PL / SQL允许您声明类型的变量my_table.some_column%type...我发现该死的非常有用。

C#允许您将对象声明为可为空或不可为空,尽管我不确定这是否可以视为类型。


4
但这cursor%rowtype甚至更有趣:它是动态形成的记录类型,可反映光标查询返回的列。
9000

.NET“ Nullable”本身实际上是一种(通用)类型。
Konamiman 2011年

3

年轻的时候,我对Euphoria的数据类型心存感激

它的结构如下:

Object
-> Atom
-> Sequence
  • 原子=单个数值
  • 序列=对象序列

    -- examples of atoms:
    
    0
    98.6
    -1e6
    
    -- examples of sequences:
    
    {2, 3, 5, 7, 11, 13, 17, 19}
    {1, 2, {3, 3, 3}, 4, {5, {6}}}
    {{"jon", "smith"}, 52389, 97.25}
    {}                        -- the 0-element sequence
    

    请参阅:参考手册

注意:“ jon”实际上是编写ASCII值序列的简便方法。例如"ABCDEFG"{65, 66, 67, 68, 69, 70, 71}


7
感觉就像LISP ...
FrustratedWithFormsDesigner

实际数据类型是唯一的位。
Dan McGrath

1
@FrustratedWithForms同样,我认为,“嘿,他说,'原子'!这看起来像(a)Lisp,但带有不必要的分隔符。:P
Mark C

3

Felix具有匿名和类型。类型写为:

typedef il = int + long;

就像理论上那样。这些值很丑陋:

case 0 of il (1)
case 1 of il (2L)

除了可能是诸如 3 = 1 + 1 + 1

case 0 of 3
case 1 of 3 

不幸的是,它使用零起点计数来实现“ C兼容性”。对于结构类型代数类型,匿名总和是必需的,例如:

(1 + T * li) as li

是T的(单链接)列表。我知道所有其他语言,需要使用名义上的总和,必须同时为类型本身和构造函数指定名称。

上面使用的速记3很可爱,库中有以下速记:

typedef void = 0;
typedef unit = 1;
typedef bool = 2;

和这个符号:

 T ^ 3

是静态长度3的数组。.3不是整数,而是3个单位的总和。可惜+没有关联:)


2

q / kdb +具有内置表。由于它是一种编程语言,并且是面向列的数据库,因此不需要LINQ或ORM。

例如,可以创建一个这样的表(分配是由:而不是=大多数语言来指定的):

people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)

现在我可以看看我的桌子:

q)show people
name  age GPA 
--------------
Joe   17  3.5 
Amy   15  3.8 
Sarah 18  3.33

我可以查询它:

q)select from people where GPA>3.4
name age GPA
------------
Joe  17  3.5
Amy  15  3.8

2

当我第一次听说工会的时候,我发现C ++中的工会是“古怪的”。我仍然没有碰到明显的实施方案。


3
联合来自C。一个很好的例子是php中的zval结构。
Martin Wickman

2
我在Z80仿真器中使用了它们,以便轻松地将16位寄存器作为整个寄存器(HL,BC)和8位寄存器(H,L,B和C)进行访问。这反映了它们在Z80 asm中的用法。同样在“变体”中,一个可以容纳不同类型值的类(例如int / float)-不知道为什么我不使用子类,但在当时是有意义的:)
ggambett,2011年

@ggambett:我的Z80程序完全一样!只是我还添加了一个位域来访问F寄存器中的各个标志。
Konamiman 2011年

2

我仍在努力解决F#和其他功能语言中的多参数函数的问题。基本上 int f(Foo,Bar) 变成 func f(Foo)

那是一个带Foo且Bar并返回一个int的两个参数函数,实际上是一个带Foo并返回一个带Bar并返回一个int的单参数函数的单参数函数。但是,您可以根据需要使用两个参数调用它。我在这里写了一篇关于它的文章


8
而是,一个函数f(Foo, Bar)f(Foo)返回另一个函数的函数相同,该函数f'(Bar)返回将返回的值f(Foo, Bar)。也就是说,如果您固定了“ Foo”自变量而不是“ Bar”自变量,则您的函数不依赖于“ Foo”,但仍依赖于“ Bar”自变量。这是功能语言的典型特征。它被称为“咖喱”。
9000

2

常用表达:

它们是功能强大但紧凑的对象。
内置这些语言的语言具有处理文本的强大能力(让它们听不到单词解析的声音不是那么好)。


2
完全有可能用正则表达式解析许多简单的语法。例如,在一组正则表达式之上以最少的逻辑分析一个ini文件是相对琐碎的。许多人犯的错误是试图用它来解析非常复杂的语法(即XML / HTML)。
马修·沙利


@Mark C:最重要的是答案(最高纪录打破了4320票)。你不能
马丁纽约

是的,那是出于幽默。当我阅读马修的评论时,它突然浮现在脑海中。
Mark C

2

函数族中的几种语言都有一类称为Unity的类型。Unity类型的显着特征是它们不包含任何信息,它们是零位类型。统一类型(在某些变体中)也是其唯一值,或者(在大多数其他情况中)仅具有一个值(本身不是一种类型)。

但是,它们是有用的,因为它们是可区分的类型。由于您不能从一个统一类型隐式转换为另一个统一类型,因此可以使静态类型检查以一种非常有效且富有表现力的方式工作。

Unity也是大多数此类语言描述Enums的方式,通过允许新类型成为定义的其他类型集中的任何一种,或描述可能的类型,这些值可以是典型类型的值(例如整数) ,或具有代表无值的值。

一些不使用用户定义的统一类型丰富性的语言在它们中仍然具有某种形式的统一性。例如,Python有至少三种类型的统一,NoneTypeNotImplementedType,和EllipsisType。有趣的是,前两个都表示“无值”之类的东西,但是第三个用于复杂值(特别是切片表达式)来表示有趣的特殊情况。

其他有趣的统一示例包括NULLsql和undefinedjavascript,但不void包括C或C ++。 void失败。即使它描述的是没有信息的值,但任何实际值都不能是type void


我认为您的意思是“单位类型”。
詹森·贝克

2

Ruby的symbol类型有点不寻常。本质上,这是一个实现单例模式的字符串。或者其他的东西。到目前为止,我发现符号的最佳用途是在跟踪状态和传递函数名称中。


也用作O(1)键比较的映射的键。
Jeremy Heiler 2011年

好吧,这并不是真的那么不寻常。Ruby从Smalltalk继承了它,而Smalltalk从Lisp继承了它。我认为Scala也有它。实际上,几乎每种语言实现(编译器或解释器)在内部都有一个符号表,Lisp,Smalltalk和Ruby只是将其公开给程序员。
约尔格W¯¯米塔格

1

COBOL。本质上只有两个基本数据类型,即字符串和数字,但是您必须准确指定它们在内存中的布局方式,例如PIC S9(5)V99 COMP-3


我可以击败。BCPL具有一种数据类型-单词;参见en.wikipedia.org/wiki/BCPL
Stephen C

有不同类型的数字(COMP,COMP-1,COMP-2,COMP-3)。
David Thornley

听起来真可怕。您能否详细说明这些细节是什么意思?
Mark C

S=有符号,9(5)= 5位数字,V=隐式小数点,99= = 2位以上的数字,COMP-3= BCD +符号半角。
dan04 2011年

1

Clipper具有“代码块”,类似于匿名方法。它们可以传递并根据需要进行评估,通常以回调的形式进行。在显示数据表时,您经常将它们用于诸如动态执行计算之类的事情。


0

VHDL具有物理类型。这种类型的文字包括值和单位。您也可以定义子单元。例如,预定义的物理类型是time

type time is range <machine dependant> to <machine dependant> 
units
  fs;
  ps = 1000 fs;
  ns = 1000 ps;
  us = 1000 ns;
  Ms = 1000 us;
  sec = 1000 ms;
  min = 60 sec;
  hr = 60 min;
end units;

与运算符重载一起,您可以定义非常有趣的事情。


0

Clojure之所以有趣,是因为它具有遍及该语言的“抽象”的元概念。例子:

  • 馆藏
  • 序列(惰性和非惰性)
  • 高阶函数
  • 多种方法
  • 通讯协定
  • 托管参考
  • 巨集
  • 各种其他.....

在某种程度上,抽象将“ 单一责任原则 ”发挥到了极致。您可以自行组合它们以获得所需的功能,但是在将它们粘合在一起时可以非常灵活。

例如,如果您希望具有继承的基于类的OOP系统,则可以相对快速地从这些核心抽象中构建一个。

实际上,以一种可以实现多种实现的方式来设计抽象本身,例如,通过特定的接口,例如对序列的clojure.lang.ISeq或对高阶函数的clojure.lang.IFn。

有一个关于这个主题的有趣视频:抽象艺术


0

如果您想要一种具有唯一类型的语言,请前往BCPL。这种语言只有一种数据类型,即单词,是该语言实现的固定位数。


0

Googles Go具有非常独特的“频道”类型。


1
频道不是唯一的。许多语言都有它们。菲利克斯(Felix)在Google成立之前就有了10年:)奥卡姆(Ocaml)在菲利克斯(Felix)成立之前已有10年。
Yttrill 2012年

在Ocaml出现之前,至少还有其他一种语言具有渠道。仍然是编程语言中最少可用的类型之一。
Brainlag 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.