关于类型:什么是Haskell缺少整体检查?

What is Haskell missing for totality checking?

全(功能)语言是一种所有内容都可以显示为终止的语言。显然,有很多地方我不想这样做——抛出异常有时很方便,Web服务器不应该终止等等。但有时,我希望进行局部总体检查以启用某些优化。例如,如果我有一个可证明的全函数

1
2
commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...

然后,由于:~:只有一个居民(Refl),GHC可以优化

1
2
3
gcastWith (commutativity @n @m) someExpression
  ==>
someExpression

我对交换性的证明是,从O(n)运行时成本到免费。所以,现在我的问题是:

在为哈斯凯尔做一个全面检查时,有哪些微妙的困难?

显然,这样的检查程序是保守的,所以当GHC不确定某个东西是完全的(或者懒得检查)时,它可能会认为它不是……在我看来,拼凑出一个不那么聪明,但仍然非常有用的检查程序也许并不难(至少消除我所有的算术证明应该很简单)。然而,我似乎找不到任何努力把这样一个东西建设成温室气体,所以很明显我错过了一些相当大的限制。继续吧,粉碎我的梦想。:)

相关但不是最近的:Neil Mitchell的《永不动摇的哈斯克尔》,2005年。


Liquid Haskell进行总量检查:https://github.com/ucsd progsys/liquid haskell终端检查

Screenshot from homepage

By default a termination check is performed on all recursive functions.

Use the no-termination option to disable the check

liquid --no-termination test.hs

In recursive functions the first algebraic or integer argument should be decreasing.

The default decreasing measure for lists is length and Integers its value.

(我为子孙后代提供了截图和引用。)

与使用agda或其他语言进行整体性检查类似,函数的参数在结构上必须随时间变小才能达到基本情况。与总量检查相结合,可以对许多函数进行可靠的检查。lh还支持通过指示减少的方式来帮助检查器,您可以使用不透明的抽象数据类型或来自ffi的抽象数据类型。这真的很实用。