我发现他们的意思是空元组。但是,它们是否也被榆树程序员用作惯例,意味着“价值可以忽略”?
is13 : Int -> Result String ()
is13 code =
if code == 13 then Ok () else Err "not the right key code"
来源:https://github.com/pdamoc/elmChallenges/blob/master/challenge5.elm
答案 0 :(得分:14)
空括号()
是所谓的单元类型,即只能拥有单个值的类型。具有至少一个项目的元组类型可以具有任意数量的值(例如,定义为一个Int
的元组的类型可以具有无限数量的值,从(-∞)
到{{1} })。但是有多少可能的“空元组”值?只有一个,因此它被称为单位类型。
单位类型的价值在于,您可以在其他语言具有(+∞)
或null
类型的地方使用它,同时避免void
带来的问题。例如,正如您所注意到的,它经常用在您想要说“我不在乎价值是什么”的地方。 但那里有价值;这并不是没有价值。
这有许多优点;例如,您可以说“所有函数返回一个值”,这将是真的。有时值是您不关心的值,但所有函数将返回一个值。在null
类型的语言中,您不能这么说。例如,C#有两种不同的方式来声明函数委托:void
用于返回类型Func<T>
的函数,而T
用于返回Action
的函数。在Elm(和F#以及使用单元类型的其他函数语言)中,不需要区分:所有函数都返回一个值,因此所有函数都可以视为void
的等价物。有时类型Func<T>
是空元组,但这意味着您不必编写两个版本,例如T
。
另一个优点是它可以让您更轻松地编写功能。以下是the Wikipedia page on unit types的示例。在C中,你不能这样做:
map
这是一个错误,因为您不允许将void f(void) {}
void g(void) {}
int main(void)
{
f(g()); // compile-time error here
return 0;
}
作为参数传递:它是值的缺席。这意味着您无法使用标准函数组合将函数void
和f
链接在一起。但是这次是同一篇文章的另一个片段,这次是C ++,如果你给C ++一个类似Elm的单元类型,它会显示 的样子:
g
现在,因为class unit_type {};
const unit_type the_unit;
unit_type f(unit_type) { return the_unit; }
unit_type g(unit_type) { return the_unit; }
int main()
{
f(g(the_unit));
return 0;
}
会返回一个实际值(即使它是您不关心的值),您可以有意义地撰写g
和f
。从长远来看,这使您的程序更加优雅,易于阅读。
可能对您有所帮助的进一步阅读: