Elm 中的空括号 `()` 是什么意思?

What do the empty parentheses `()` mean in Elm?

我发现它们是一个空元组。但是,它们是否也被 Elm 程序员用作表示 "value can be ignored" 的约定?

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

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

单位类型的价值在于,您可以在其他语言具有 nullvoid 类型的地方使用它,同时避免 null 带来的问题它。例如,正如您所注意到的,它经常用在您想说 "I don't care what the value is" 的地方。 但是那里有一个值;这不是没有价值。

这有很多优点;例如,您可以说“ALL functions return a value”,这就是真的。有时这个值是您不关心的值,但是 所有 函数都会 return 一个值。在具有 void 类型的语言中,您不能这样说。例如,C# 有两种不同的方法来声明函数委托:Func<T> 用于函数 returning 类型 TAction 用于函数 returning void。在 Elm(以及 F# 和其他使用单元类型的函数式语言)中,不需要这种区分:所有函数 return 一个值,因此所有函数都可以被视为等同于 Func<T>。有时类型 T 是空元组,但这意味着您不必编写两个版本,例如 map.

另一个优点是它可以让您更轻松地编写函数。这是取自 the Wikipedia page on unit types 的示例。在 C 中,你不能这样做:

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

int main(void)
{
  f(g()); // compile-time error here
  return 0;
}

这是一个错误,因为您不允许将 void 作为参数传递:它是一个值的 缺失 。这意味着您不能使用标准函数组合将函数 fg 链接在一起。但这是同一篇文章的另一个片段,这次是 C++,展示了如果你给 C++ 一个类似 Elm 的单元类型,它 的样子:

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 return 是一个真实值(即使它是您不关心的值),您可以有意义地组合 fg。这让你的程序在长长的 运行.

中更加优雅和易读。

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

  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?

希望对您有所帮助!