证明λx。Ω≠Ω中是阿布拉姆斯基给他的懒惰演算理论(第2页的目标之一他的论文,由乌代雷迪已经引用),因为他们都处于弱势头部正常形态。从定义2.7开始,他明确讨论了eta约简λx。M x→M通常不是有效的,但是如果M在所有环境中都终止,则有可能。这并不意味着M必须是一个总函数-只是求值M必须终止(例如,通过减小为lambda)。
您的问题似乎是由实际问题(性能)引起的。但是,即使Haskell报告可能还不够完全清楚,但我怀疑是否等于λx。与配合使用将产生Haskell的有用实现;是否实施Haskell '98尚有待商but,但鉴于此,作者显然希望如此。
最后,seq如何为任意输入类型生成元素?(我知道QuickCheck为此定义了Arbitrary类型类,但是您不允许在此处添加此类约束)。这违反了参数化。
更新:我没有设法对此进行编码(因为我不太熟悉Haskel),并且解决此问题似乎需要嵌套runST
区域。我尝试使用单个参考单元(在ST monad中)保存这样的任意元素,以后再读取它们,并使其普遍可用。参数性证明break_parametricity
不能定义下方(除非返回底部,例如返回错误),但可以恢复提议的seq会生成的元素。
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
我必须承认,我对此处需要的参数化证明的形式化有些模糊,但是这种非正式的参数化使用在Haskell中是标准的。但是我从德里克·德雷尔(Derek Dreyer)的著作中学到,近几年来,所需的理论正在迅速得到解决。
编辑:
- 我什至不确定您是否需要那些针对类似于ML的语言,命令式和无类型语言进行了研究的扩展,或者经典的参数化理论是否涵盖了Haskell。
- 另外,我之所以提到德里克·德雷尔(Derek Dreyer)只是因为我后来才接触到乌代·雷迪(Uday Reddy)的作品-我是最近才从《雷诺兹的本质》中学到的。(我只是在上个月左右才真正开始阅读有关参数的文献)。