我发现它们是一个空的元组。但是,它们是否也被Elm程序员用作约定,以表示“值可以忽略”?
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
空括号()
是所谓的单元类型,即只能有一个值的类型。具有至少一项的元组类型可以具有任意数量的值(例如,定义为一个元组的类型Int
可以具有从(-∞)
到的无限数量的值(+∞)
)。但是“空元组”有多少可能的值?仅此一个,因此为什么将其称为单元类型。
单位类型的价值在于您可以在其他语言可能具有anull
或void
type的地方使用它,同时避免null
随之而来的问题。例如,您已经注意到,它经常用在您想说“我不在乎值是什么”的地方。但是那里有一个价值。这不是缺乏价值。
这有很多优点。例如,您可以说“所有函数都返回一个值”,这将是正确的。有时,该值是您不关心的值,但是所有函数都会返回一个值。在某种void
类型的语言中,您不能这么说。例如,C#有两种不同的方式来声明函数委托:Func<T>
用于函数返回类型T
,以及Action
用于函数return void
。在Elm(以及F#和其他使用单元类型的功能语言)中,无需进行区分:所有函数都返回一个值,因此所有函数都可以视为的等效项Func<T>
。有时typeT
是一个空的元组,但这意味着您不必编写的两个版本map
。
另一个优点是,它使您可以更轻松地编写函数。这是来自Wikipedia页面上有关单位类型的示例。在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
返回了实际值(即使它是一个你不关心),你可以撰写f
和g
有意义。从长远来看,这使您的程序更优雅,更易于阅读。
一些可能有助于您的进一步阅读:
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句