空括号`()`在榆树中意味着什么?

时间:2015-11-27 01:29:14

标签: functional-programming elm unit-type

我发现他们的意思是空元组。但是,它们是否也被榆树程序员用作惯例,意味着“价值可以忽略”?

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

1 个答案:

答案 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; } 作为参数传递:它是值的缺席。这意味着您无法使用标准函数组合将函数voidf链接在一起。但是这次是同一篇文章的另一个片段,这次是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; } 会返回一个实际值(即使它是您不关心的值),您可以有意义地撰写gf。从长远来看,这使您的程序更加优雅,易于阅读。

可能对您有所帮助的进一步阅读:

  1. https://en.wikipedia.org/wiki/Unit_type(我已在此答案中链接过一次)
  2. Why do I need to use the unit type in F# if it supports the void type?
  3. 希望这有帮助!