【问题标题】:Void in constrast with UnitVoid 与 Unit 对比
【发布时间】:2009-12-14 13:35:48
【问题描述】:

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

【问题讨论】:

    标签: f# functional-programming void unit-type


    【解决方案1】:

    单位类型只会让一切变得更规律。在某种程度上,您可以将 F# 中的每个函数视为采用单个参数并返回单个结果。不需要任何参数的函数实际上将“unit”作为参数,不返回任何结果的函数返回“unit”作为结果。这有很多优点;一方面,考虑在 C# 中你如何需要大量“Func”委托来表示各种返回值的函数,以及大量不返回值的“Action”委托(因为例如 Func<int,void> 不是合法的 - void 不能这样使用,因为它不是一个“真正的”类型)。

    另见F# function types: fun with tuples and currying

    【讨论】:

    • And () 只是 n 元组的逻辑结尾,一个 0 元素的元组!
    【解决方案2】:

    在函数式编程中,我们通常说将输入映射到输出。这实际上意味着将参数映射到它的返回值。但是,如果某些东西要成为数学/类别理论意义上的函数,它必须返回 somethingvoid 值表示函数不返回任何内容,这在这些术语中是无意义的。

    unitvoid 的功能答案。它本质上是一个只有一个值的类型,()。它有很多用途,但这里有一个简单的。假设您在更传统的命令式语言中有类似的东西:

    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&lt;T&gt;,这可能会变得很笨重。

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

    【讨论】:

    • 这个答案也是+1。您的 sn-p 非常彻底。谢谢!
    猜你喜欢
    • 2019-09-21
    • 2023-03-17
    • 1970-01-01
    • 2015-11-24
    • 2020-03-08
    • 2015-01-31
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多