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 类型。
单位类型的价值在于,您可以在其他语言具有 null
或 void
类型的地方使用它,同时避免 null
带来的问题它。例如,正如您所注意到的,它经常用在您想说 "I don't care what the value is" 的地方。 但是那里有一个值;这不是没有价值。
这有很多优点;例如,您可以说“ALL functions return a value”,这就是真的。有时这个值是您不关心的值,但是 所有 函数都会 return 一个值。在具有 void
类型的语言中,您不能这样说。例如,C# 有两种不同的方法来声明函数委托:Func<T>
用于函数 returning 类型 T
,Action
用于函数 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
作为参数传递:它是一个值的 缺失 。这意味着您不能使用标准函数组合将函数 f
和 g
链接在一起。但这是同一篇文章的另一个片段,这次是 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 是一个真实值(即使它是您不关心的值),您可以有意义地组合 f
和 g
。这让你的程序在长长的 运行.
中更加优雅和易读。
一些可能对您有帮助的进一步阅读:
- https://en.wikipedia.org/wiki/Unit_type(我已经在此答案中链接过一次)
- Why do I need to use the unit type in F# if it supports the void type?
希望对您有所帮助!
我发现它们是一个空元组。但是,它们是否也被 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 类型。
单位类型的价值在于,您可以在其他语言具有 null
或 void
类型的地方使用它,同时避免 null
带来的问题它。例如,正如您所注意到的,它经常用在您想说 "I don't care what the value is" 的地方。 但是那里有一个值;这不是没有价值。
这有很多优点;例如,您可以说“ALL functions return a value”,这就是真的。有时这个值是您不关心的值,但是 所有 函数都会 return 一个值。在具有 void
类型的语言中,您不能这样说。例如,C# 有两种不同的方法来声明函数委托:Func<T>
用于函数 returning 类型 T
,Action
用于函数 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
作为参数传递:它是一个值的 缺失 。这意味着您不能使用标准函数组合将函数 f
和 g
链接在一起。但这是同一篇文章的另一个片段,这次是 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 是一个真实值(即使它是您不关心的值),您可以有意义地组合 f
和 g
。这让你的程序在长长的 运行.
一些可能对您有帮助的进一步阅读:
- https://en.wikipedia.org/wiki/Unit_type(我已经在此答案中链接过一次)
- Why do I need to use the unit type in F# if it supports the void type?
希望对您有所帮助!