Functional programming 非终止函数是否具有类型?

Functional programming 非终止函数是否具有类型?,functional-programming,ocaml,Functional Programming,Ocaml,例如,假设f1中的fx=fx。是否定义了其签名? 如果是,是什么? 有人可能会说,OCaml不知道它没有终止,它的类型只是推断为'a。对吗? let a b = let rec f x = f x in f 1;; 例如vala:'a->'b即使应用a很明显,也不会有'b那么当您有type(E)=t时,对声音类型系统的要求是,如果E的计算结果为某个值v,然后v是属于类型T的值。当表达式给出值时,类型是有意义的,而异常和无限循环则没有 然而,类型检查器是total,并为所有表达式提供一个类型,即

例如,假设f1中的fx=fx。是否定义了其签名?
如果是,是什么? 有人可能会说,OCaml不知道它没有终止,它的类型只是推断为
'a
。对吗?

let a b = let rec f x = f x in f 1;;

例如
vala:'a->'b
即使应用
a
很明显,也不会有
'b
那么当您有
type(E)=t
时,对声音类型系统的要求是,如果
E
的计算结果为某个值
v
,然后
v
是属于类型
T
的值。当表达式给出值时,类型是有意义的,而异常和无限循环则没有

然而,类型检查器是total,并为所有表达式提供一个类型,即使它只是一个自由类型变量

此处返回类型未绑定,打印为
'a

# let f x = if x then (failwith "A") else (failwith "B");;
val f : bool -> 'a = <fun>

读取函数类型(如
unit->'a
)的一种方法是记住 类型变量
'a
包含空类型

例如,如果我有一个函数
f

let rec f:'a. _ -> 'a = fun () -> f ()
和一个空类型

type empty = |
(* using 4.07 empty variants *)
(* or *)
type (_,_) eq = Refl: ('a,'a) eq
type empty = (float,int) eq
然后我可以将f的类型限制为
unit->empty

 let g: unit -> empty = f
此外,更一般的
f
类型在存在分支时也很有用。 例如,我可以定义一个
返回
,它按顺序引发异常 要提前退出for循环,请执行以下操作:

let search pred n =
  let exception Return of int in
  let return: 'a. int -> 'a = fun n -> raise (Return n) in
  try
    for i = 0 to n do
      if pred i then return i
    done;
    None
 with Return n -> Some n
这里,
return
的多态类型使得在上下文中使用它成为可能
在我看来,你的
a
就是你所说的类型。所以它有一个类型。但这不是任何正常返回的函数的类型。请注意,它也是
let f x=raise Not_found
的类型。一般来说,我会说
val a:'a->Void
,但Ocaml似乎没有Void类型。不终止对类型没有影响(它会打开一个巨大的不可判定蠕虫的罐子)。您的第一个示例可以简化为
let rec f x=f 1
,其类型为
int->'a
。另请参见:
let search pred n =
  let exception Return of int in
  let return: 'a. int -> 'a = fun n -> raise (Return n) in
  try
    for i = 0 to n do
      if pred i then return i
    done;
    None
 with Return n -> Some n