关于清单1,需要满足类型层次公理。
(t a) = (t (getUI(t a)))
每个特定类型类实例都应该能够推导出一个定理。
test
函数的编译是否证明了程序中特定类型的类型级公理成立?编译是否提供了免费的定理! 的示例?
清单1
{-# LANGUAGE MultiParamTypeClasses #-}
data Continuant a = Continuant a deriving (Show,Eq)
class UI a where
instance UI Int where
class Category t a where
getUI :: (UI a) => (t a) -> a
instance Category Continuant Int where
getUI (Continuant a) = a
-- axiom (t a) = (t (getUI(t a))) holds for given types?
test :: Int -> Bool
test x = (Continuant x) == (Continuant (getUI (Continuant x)))
附加背景
这段代码基于一篇论文,其中提到:
对于 getUI 的所有实现,我们可以要求公理 (t a) = (t (getUI (t a))) 成立。必须证明每个特定类型类实例声明都符合这个公理。对于有限类型,可以通过一个枚举所有可能性的程序来完成。对于无限类型,必须通过归纳证明手动完成。
清单1 是我的尝试证明。在解决方案1的光芒下,也许我错误地认为这需要自由定理!