Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 与单位对比无效_F#_Functional Programming_Void_Unit Type - Fatal编程技术网

F# 与单位对比无效

F# 与单位对比无效,f#,functional-programming,void,unit-type,F#,Functional Programming,Void,Unit Type,我想了解这两个编程概念之间的区别。第一种表示没有数据类型,而第二种表示类型存在但没有信息。另外,我认识到该单元来自函数编程理论基础,但我仍然不能理解单元原语的可用性(例如,在f*程序中)。在函数编程中, ,我们通常讲映射输入到输出。这从字面上来说意味着将一个参数映射到它的返回值。但是,如果某种东西是数学/范畴理论意义上的函数,它必须返回某种东西。void值表示函数不返回任何内容,这在这些术语中是毫无意义的 unit是对void的功能性回答。它本质上是一个只有一个值的类型,()。它有很多用途,但这

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

,我们通常讲映射输入到输出。这从字面上来说意味着将一个参数映射到它的返回值。但是,如果某种东西是数学/范畴理论意义上的函数,它必须返回某种东西。
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;
}
公共静态列表映射(列表中,函数func){
List out=new ArrayList(in.size());
for(T:in){
out.add(函数应用(t));
}
返回;
}
这将对列表中的每个元素应用一个特定的函数
func
,生成一个新的
func
输出类型列表但如果传入一个只打印其参数的函数,会发生什么情况?它没有输出类型,那么您可以为
U
输入什么

在某些语言中,传入这样一个函数会破坏这段代码(比如在C#中,不能将
void
赋值给泛型类型)。你必须求助于一些变通办法,比如做一个
动作
,这可能会变得笨重


这就是
单位的概念有用的地方:它是一种类型,但可能只具有一个值。这大大简化了链接和组合之类的事情,并大大减少了您需要担心的特殊情况的数量。

单元类型只是让一切变得更加规则。在某种程度上,你可以把F#中的每一个函数看作是接受一个参数并返回一个结果。不需要任何参数的函数实际上以“unit”作为参数,而不返回任何结果的函数则返回“unit”作为结果。这有多种优势;首先,考虑C语言中,如何既需要一组“FUNC”委托来表示返回值的各种特性的函数,还需要一组不返回值的“动作”委托(因为,例如“代码> FUNC < /代码>是不合法的”-无效不能使用这种方式,因为它不是一个“真实”类型)。
另请参见

和(),它只是n元元组(0元素元组)的逻辑结尾+这个答案我也是。你的片段写得很透彻。谢谢!