Bri*_*ian 12
单位类型只是使一切更加规律.在某种程度上,您可以将F#中的每个函数视为采用单个参数并返回单个结果.不需要任何参数的函数实际上将"unit"作为参数,并且不返回任何结果的函数返回"unit"作为结果.这具有多种优点; 首先,考虑如何在C#中同时需要一大堆"Func"代表来表示返回值的各种arities的函数,以及一系列不返回值的"Action" Func<int,void>代理(因为例如不合法 - 无效)不能那样使用,因为它不是一个"真正的"类型).
在函数式编程中,我们通常谈到将输入映射到输出.这实际上意味着将参数映射到其返回值.但是,如果某些东西在数学/类别理论意义上将成为一种功能,它必须返回一些东西.一个void值表示函数没有返回值,这是在这些条款荒谬的.
unit是功能性答案void.它本质上只是一个只有一个值的类型().它有很多用途,但这里很简单.假设你用更传统的命令式语言有这样的东西:
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;
}
Run Code Online (Sandbox Code Playgroud)
这将特定函数应用于func列表中的每个元素,从而生成新func的输出类型列表.但是,如果传入一个只打印其参数的函数会发生什么?它没有输出类型,所以你可以放U什么?
在某些语言中,传入这样的函数会破坏此代码(例如在C#中,您无法分配void给泛型类型).你不得不采取类似于拥有的解决方法Action<T>,这可能变得笨重.
这是概念unit有用的地方:它是一种类型,但只能采用单一值.这大大简化了链接和组合等内容,大大减少了您不必担心的特殊情况.