Functional programming 非终止函数是否具有类型?
例如,假设f1中的fx=fx。是否定义了其签名?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,并为所有表达式提供一个类型,即
如果是,是什么? 有人可能会说,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