首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Unit对比中的Void

与Unit对比中的Void
EN

Stack Overflow用户
提问于 2009-12-14 21:35:49
回答 2查看 1.2K关注 0票数 8

我想要了解这两个编程概念之间的区别。第一个表示缺少数据类型,而后者表示类型存在,但没有信息。此外,我认识到单元来自函数式编程的理论基础,但我仍然不能理解单元原语的可用性(例如,在F#程序中)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-14 21:48:41

单元类型只会让一切变得更规则。在某种程度上,您可以将F#中的每个函数视为接受单个参数并返回单个结果。不需要任何参数的函数实际上以"unit“作为参数,而不返回任何结果的函数返回"unit”作为结果。这有很多优点;首先,考虑一下在C#中,你如何既需要大量的“函数”委托来表示返回值的各种机构的函数,也需要大量不返回值的“操作”委托(因为Func<int,void>是非法的--Func<int,void>不能以这种方式使用,因为它不是真正的类型)。

另请参阅F# function types: fun with tuples and currying

票数 12
EN

Stack Overflow用户

发布于 2009-12-14 21:48:16

在函数式编程中,我们通常谈到将输入映射到输出。从字面上看,这意味着将参数映射到它的返回值。但是,如果某个函数是数学/范畴理论意义上的函数,那么它必须返回一些东西。void值表示函数不返回任何内容,这在这些术语中是无意义的。

unit是对void的函数式回答。它本质上是一个只有一个值的类型,()。它有许多用途,但这里有一个简单的用途。假设你在一种更传统的命令式语言中有类似的东西:

代码语言:javascript
运行
复制
public static <T, U> List<U> map(List<T> in, Function<T, U> func) {
  List<U> out = new ArrayList<U>(in.size());
  for (T t : in) {
     out.add(func.apply(t));
  }
  return out;
}

这会将一个特定的函数func应用到列表中的每个元素,生成一个新的func输出类型列表。但是,如果您传入一个只打印其参数的函数,会发生什么呢?它没有输出类型,那么您可以为U设置什么

在某些语言中,传入这样的函数会破坏这段代码(比如在C#中,您不能将void赋给泛型类型)。您将不得不求助于变通方法,如拥有Action<T>,这可能会变得笨拙。

这就是 unit 概念有用的地方:它是一个类型,但只能接受单个值。这极大地简化了诸如链接和组合之类的事情,并极大地减少了您必须担心的特殊情况的数量。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1900962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档