Answers:
主要区别在于两个方面-在基础理论和如何使用它们方面。让我们只关注后者。
作为用户,LiquidHaskell和精炼类型系统中的规范“逻辑”通常仅限于可确定的片段,因此验证(和推断)是完全自动的,这意味着不需要完整的“证明项”依赖设置。这导致了显着的自动化。例如,比较LH中的插入排序:
http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists
与伊德里斯
https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr
但是,自动化需要付出一定的代价。在完全依赖的世界中,不能像在完全依赖的世界中那样使用任意函数作为规范,这限制了人们可以编写的属性类别。
因此,优化系统的一个目标是扩展可以指定的类别,而完全依赖系统的目标是使 可以证明的自动化。也许有一个快乐的聚会场所,我们可以两全其美!
[1]中描述的Liquid Type系统确实是可判定的,Liquid Haskell确实使用SMT求解器。但是,Liquid Haskell也需要证明项(或值,因为它们是用非依赖类型的语言来调用的):如果您坐下来编写Liquid Haskell程序,那么您将编写自己的函数,而不仅仅是类型。
依赖类型是以任何方式依赖值的类型。一个典型的例子是“长度向量的类型n
”,其中n
是一个值。就像您在问题中所说的那样,精简类型由满足给定谓词的给定类型的所有值组成。例如正数的类型。这些概念并不是特别相关(据我所知)。当然,您也可以合理地具有从属细化类型,例如“大于所有数字的类型n
”。
0
”的数字的类型?