As principais diferenças estão em duas dimensões - na teoria subjacente e em como elas podem ser usadas. Vamos apenas focar no último.
Como usuário, a "lógica" das especificações dos sistemas LiquidHaskell e do tipo de refinamento geralmente é restrita a fragmentos decidíveis, de modo que a verificação (e inferência) é totalmente automática, o que significa que não é necessário "termos de prova" do tipo necessário na íntegra. configuração dependente. Isso leva a uma automação significativa. Por exemplo, compare a classificação de inserção no LH:
http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists
vs. em Idris
https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr
No entanto, a automação tem um preço. Não se pode usar funções arbitrárias como especificações, como no mundo totalmente dependente, o que restringe a classe de propriedades que se pode escrever.
Assim, um objetivo dos sistemas de refinamento é estender a classe do que pode ser especificado, enquanto o dos sistemas totalmente dependentes é automatizar o
que pode ser provado. Talvez haja um local de encontro feliz, onde possamos obter o melhor dos dois mundos!