Haskell缺少整体检查的内容?
总(功能性)语言是一切可以显示终止的语言。 显然,有很多地方我不希望这样 - 抛出异常有时很方便,Web服务器不应该终止,等等。但有时候,我想要一个局部总体检查来启用某些优化。 例如,如果我有一个可证明的全部功能
commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...
那么,因为:~:
只有一个居民( Refl
),GHC可以优化
gcastWith (commutativity @n @m) someExpression
==>
someExpression
我的交换性证明从O(n)
运行时成本变为免费。 所以,现在对于我的问题:
为Haskell制作一个总体检查器有什么微妙的困难?
显然,这样一个检查器是保守的,所以每当GHC不确定什么是总数(或者是懒惰检查)时,它可以认为它不是......似乎对我来说可能不是太困难,如此聪明的检查器仍然非常有用(至少它应该是直截了当的,以消除我所有的算术证明)。 然而,我似乎没有找到任何努力在GHC中建立这样的事情,所以显然我错过了一些相当大的限制。 继续吧,粉碎我的梦想。 :)
相关但不近期:2005年,Neil Mitchell未破坏Haskell。
Liquid Haskell进行全面检查:https://github.com/ucsd-progsys/liquidhaskell#termination-check
默认情况下,会对所有递归函数执行终止检查。
使用无终止选项来禁用检查
液体 - 无终止test.hs
在递归函数中,第一个代数或整数参数应该减少。
列表的默认递减度量是length和Integers的值。
(我包括截图和引用后人。)
与Agda或其他具有总体检查的语言类似,函数的参数必须在结构上随着时间的推移变小以达到基本情况。 结合总体检查器,这可以检查多项功能。 LH还支持通过指示事物减少的方式帮助检查者,您可以使用不透明的抽象数据类型或FFI进行检查。 这真的很实用。
链接地址: http://www.djcxy.com/p/43195.html上一篇: What is Haskell missing for totality checking?
下一篇: Benefit of Erlang for collaborative real time application