标题是简单的问题。
身份函数fun x -> x
的类型为'a -> 'a
。
是否还有其他类型'a -> 'a
我想不出另一个。
答案 0 :(得分:15)
没有
fun x -> print_endline "foo"; x;;
(failwith "bang" : 'a -> 'a);;
(fun x -> failwith "bang" : 'a -> 'a);;
(fun x -> List.hd [] : 'a -> 'a);;
let rec f (x : 'a) : 'a = f x;;
let counter = ref 0;;
(fun x -> incr counter; x);;
身份函数是总编程语言中'a -> 'a
的唯一居民,没有任何副作用,包括不确定。 OCaml和Haskell都没有资格,但是一些语言用作证明助手(这个整体很重要),特别是Coq(具有用于制定这种类型的不可预测的多态性)。