我已经多次看到声称可以证明具有类型签名的函数
的声明α → α
只能通过返回参数来实现,因为我们对参数的类型一无所知。
id :: α → α
id a = a
可以在http://blog.precog.com/?p=431
找到该声明的例子但是什么阻止我们制作像这样的if语句(伪代码)?
id :: α → α
id a = if ( a is_a_String) a + "hello"
else a
我缺少一个先决条件吗?
答案 0 :(得分:2)
这样的定理仅适用于具有 parametricity 属性的语言。这意味着代码无法在运行时检查类型,因此,执行永远不能依赖于类型信息。大多数函数式语言都具有此属性,而OO语言通常会看到需要提供向下转换和类似功能,这会破坏参数。
Parametricity是一个非常强大的属性。它确保了某些抽象属性,所谓的"free theorems"就像你提到的那样,它是高效实现的推动者,可以在运行时擦除类型。