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

dgo*_*o.a 11 functional-programming unit-type elm

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

is13 : Int -> Result String ()
is13 code =
  if code == 13 then Ok () else Err "not the right key code"
Run Code Online (Sandbox Code Playgroud)

资料来源:https://github.com/pdamoc/elmChallenges/blob/master/challenge5.elm

rmu*_*unn 14

空括号()是所谓的单位类型,即只能拥有单个值的类型.具有至少一个项目的元组类型可以具有任意数量的值(例如,定义为一个元组的元素Int可以具有无限数量的值,从中(-?)(+?)).但是有多少可能的"空元组"值?只有一个,因此它被称为单位类型.

单元类型的值是您可以在其他语言具有nullvoid类型的地方使用它,同时避免null随之而来的问题.例如,正如您所注意到的,它经常用在您想要说"我不在乎价值是什么"的地方.那里有价值; 这并不是没有价值.

这有许多优点; 例如,你可以说" 所有函数返回一个值",这将是真的.有时值是您不关心的值,但所有函数都将返回一个值.在具有void类型的语言中,您不能这么说.例如,C#有两种不同的方式来声明函数委托:Func<T>用于一个函数返回类型T,并Action为一个函数返回void.在Elm(和F#以及使用单元类型的其他函数语言)中,不需要区分:所有函数都返回一个值,因此所有函数都可以被视为等价的Func<T>.有时类型T是空元组,但这意味着你不必写两个版本,比如说map.

另一个优点是它可以让您更轻松地编写功能.这是一个关于单位类型的维基百科页面的例子.在C中,你不能这样做:

void f(void) {}
void g(void) {}

int main(void)
{
  f(g()); // compile-time error here
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为您不允许void作为参数传递:它是缺少值.这意味着你不能使用标准的函数组合到链职能fg在一起.但这里是从同一篇文章的另一个片段,C++这个时候,显示它是什么看起来一样,如果你给了C++的榆树样的单位类型:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,因为g返回了实际值(即使它是一个你不关心),你可以撰写fg有意义.从长远来看,这使您的程序更加优雅,易于阅读.

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

  1. https://en.wikipedia.org/wiki/Unit_type(我已在此答案中链接过一次)
  2. 如果支持void类型,为什么我需要在F#中使用单位类型?

希望这可以帮助!