我们都看到过整数,浮点数,字符串和偶数十进制类型。您遇到过的最奇怪,独特或有用的类型有哪些?
我们都看到过整数,浮点数,字符串和偶数十进制类型。您遇到过的最奇怪,独特或有用的类型有哪些?
Answers:
我会简短:
Maybe a
在Haskell。
通过这种简单的结构,该语言解决了崩溃问题,或者NullPointerException
巧妙地避开了Tony Hoare的“百万错误” :)
坦白说,在编译时检查了一个可选的存在吗?像梦一样...
Option
名字。为什么不Optional
呢!可能是因为我不是母语人士,但Option
没有向我传达“可选”的意思。
Maybe
名字很可爱:“你有什么?” “也许是一个int”。但是,真正巧妙的一点是,它既是函子又是单子函数,用简单的方式来说,这意味着您可以免费获得零传播。您无需在函数内部或代码中间放置null检查。您只需要在代码的最后检查它(如果有的话)。
Maybe
Ruby 有一个monad:lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
我常年喜欢void *
。这可能是我内心深处有缺陷的症状。
void *
而Pascal / Delphi则有Pointer
。
Lua的内置桌子令人印象深刻。它具有内置的哈希表和向量,并且使用元表可以成为过程语言中面向对象编程的基本基础。
表的每个索引都可以接收任何基本语言结构(数字,布尔值,字符串,函数-是,函数是lua上的类型-和表)。
Fortran具有常见的功能块;它是现代语言中最不常见的数据类型之一,或者说是一种有效共享数据的不寻常方式。
Fortran 95具有间隔类型和内置的间隔算法。
没有在Haskell中找到的单子类型,该列表将不完整。要了解它们,您需要付出一些努力。
PL / SQL允许您声明类型的变量my_table.some_column%type
...我发现该死的非常有用。
C#允许您将对象声明为可为空或不可为空,尽管我不确定这是否可以视为类型。
cursor%rowtype
甚至更有趣:它是动态形成的记录类型,可反映光标查询返回的列。
它的结构如下:
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}
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个单位的总和。可惜+没有关联:)
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
当我第一次听说工会的时候,我发现C ++中的工会是“古怪的”。我仍然没有碰到明显的实施方案。
我仍在努力解决F#和其他功能语言中的多参数函数的问题。基本上 int f(Foo,Bar) 变成 func f(Foo)
那是一个带Foo且Bar并返回一个int的两个参数函数,实际上是一个带Foo并返回一个带Bar并返回一个int的单参数函数的单参数函数。但是,您可以根据需要使用两个参数调用它。我在这里写了一篇关于它的文章
f(Foo, Bar)
与f(Foo)
返回另一个函数的函数相同,该函数f'(Bar)
返回将返回的值f(Foo, Bar)
。也就是说,如果您固定了“ Foo”自变量而不是“ Bar”自变量,则您的函数不依赖于“ Foo”,但仍依赖于“ Bar”自变量。这是功能语言的典型特征。它被称为“咖喱”。
它们是功能强大但紧凑的对象。
内置这些语言的语言具有处理文本的强大能力(让它们听不到单词解析的声音不是那么好)。
函数族中的几种语言都有一类称为Unity的类型。Unity类型的显着特征是它们不包含任何信息,它们是零位类型。统一类型(在某些变体中)也是其唯一值,或者(在大多数其他情况中)仅具有一个值(本身不是一种类型)。
但是,它们是有用的,因为它们是可区分的类型。由于您不能从一个统一类型隐式转换为另一个统一类型,因此可以使静态类型检查以一种非常有效且富有表现力的方式工作。
Unity也是大多数此类语言描述Enums的方式,通过允许新类型成为定义的其他类型集中的任何一种,或描述可能的类型,这些值可以是典型类型的值(例如整数) ,或具有代表无值的值。
一些不使用用户定义的统一类型丰富性的语言在它们中仍然具有某种形式的统一性。例如,Python有至少三种类型的统一,NoneType
,NotImplementedType
,和EllipsisType
。有趣的是,前两个都表示“无值”之类的东西,但是第三个用于复杂值(特别是切片表达式)来表示有趣的特殊情况。
其他有趣的统一示例包括NULL
sql和undefined
javascript,但不void
包括C或C ++。 void
失败。即使它描述的是没有信息的值,但任何实际值都不能是type void
。
Ruby的symbol
类型有点不寻常。本质上,这是一个实现单例模式的字符串。或者其他的东西。到目前为止,我发现符号的最佳用途是在跟踪状态和传递函数名称中。
COBOL。本质上只有两个基本数据类型,即字符串和数字,但是您必须准确指定它们在内存中的布局方式,例如PIC S9(5)V99 COMP-3
。
S
=有符号,9(5)
= 5位数字,V
=隐式小数点,99
= = 2位以上的数字,COMP-3
= BCD +符号半角。
Googles Go具有非常独特的“频道”类型。