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可以具有无限数量的值,从中(-?)到(+?)).但是有多少可能的"空元组"值?只有一个,因此它被称为单位类型.
单元类型的值是您可以在其他语言具有null或void类型的地方使用它,同时避免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作为参数传递:它是缺少值.这意味着你不能使用标准的函数组合到链职能f和g在一起.但这里是从同一篇文章的另一个片段,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返回了实际值(即使它是一个你不关心),你可以撰写f和g有意义.从长远来看,这使您的程序更加优雅,易于阅读.
一些可能对您有帮助的进一步阅读:
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1328 次 |
| 最近记录: |