对于足够多态的类型,参数可以唯一地确定函数本身(有关详细信息,请参阅Wadler's Theorems for free!)。例如,类型为forall t. t -> t
的唯一总函数是标识函数id
。
是否有可能在伊德里斯声明并证明这一点? (如果它不能在伊德里斯内部得到证实,那么它是真的吗?)
以下是我的尝试(我知道函数相等在Idris中不是原始概念,所以我断言泛型类型t -> t
的任何函数总是返回与标识函数返回的相同的结果):< / p>
%default total
GenericEndomorphism: Type
GenericEndomorphism = (t: Type) -> (t -> t)
id_is_an_example : GenericEndomorphism
id_is_an_example t = id
id_is_the_only_example : (f : GenericEndomorphism) -> (t : Type) -> (x : t) -> f t x = x
id_is_the_only_example f t x = ?id_is_the_only_example_rhs
产生的洞是:
- + Main.id_is_the_only_example_rhs [P]
`-- f : GenericEndomorphism
t : Type
x : t
-------------------------------------------------------
Main.id_is_the_only_example_rhs : f t x = x
答案 0 :(得分:15)
你做不到。像这样的定理(“自由定理”)假设类型是抽象的,你不能在它们上进行模式匹配或以任何方式辨别它们的结构。但是你无法在Idris内部表达类型的抽象属性。没有类型理论的主流实现使这成为可能。 Type theory in color具有此功能,但它非常复杂,没有实际实现。
您仍然可以假设自由定理并使用它们,但您必须确保它们不会阻止对您要评估的事物进行评估。