Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Functional programming 单元类型和'之间的差异;用ocaml表示的_Functional Programming_Ocaml - Fatal编程技术网

Functional programming 单元类型和'之间的差异;用ocaml表示的

Functional programming 单元类型和'之间的差异;用ocaml表示的,functional-programming,ocaml,Functional Programming,Ocaml,OCaml中的unit->unit和'a->'a有什么区别 例如: # let f g a = if (g a > a) then a ;; val f : (unit -> unit) -> unit -> unit = <fun> # let f g a = if (g a > a ) then a else a;; val f : ('a -> 'a) -> 'a -> 'a = <fun> #设fga=if(ga

OCaml中的
unit->unit
'a->'a
有什么区别

例如:

# let f g a = if (g a > a) then a ;;
val f : (unit -> unit) -> unit -> unit = <fun>

# let f g a = if (g a > a ) then a else a;;
val f : ('a -> 'a) -> 'a -> 'a = <fun>
#设fga=if(ga>a)then a;;
val f:(单位->单位)->单位->单位=
#设f g a=如果(g a>a),则a为其他a;;
val f:('a->'a)->'a->'a=

为什么第一个变量给出了
unit->unit
,第二个变量给出了
'a->'a

第一个变量中的
if
表达式没有
else
子句,所以
if
表达式的真正分支必须有type
unit
。这意味着
a
的类型也必须是
unit
,而
g
的类型必须是
unit->unit


在第二个变体中,由于
else
子句,唯一的要求是
if
表达式的true和false分支具有相同的类型,因此该类型是泛化的,
g

的类型也是泛化的。请注意,在OCaml中,
if
是一个表达式:它返回一个值

理解你的问题的关键是

if condition then a
相当于

if condition then a else ()
if
的键入规则如下:

  • 条件应具有类型
    bool
  • 两个分支应具有相同的类型
  • 整个if表达式的类型与分支相同

换句话说,在
if cond then a
中,
a
应该有type
unit

unit
是函数不返回任何内容时使用的类型(基本上是打印内容的函数)


'a
是中性类型。它是任何类型的占位符。

单位类型是只有一个值的类型,写入
()
。如果你写的是
如果是c那么是a
,那么就有一个隐式的
else()
分支。@AhmedBaoun把单位类型看作一个空类型可能会有所帮助。单位类型在一开始是一个奇怪的概念。就我个人而言,我将其翻译为«副作用»,如果函数在输入时有副作用的数据,我将添加一个单位类型参数,如果输出有副作用,我将从单位类型返回单位值。这是一种用«警告副作用区域»记录代码的方法。