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!
O sistema Liquid Type, descrito em [1], é realmente decidível e o Liquid Haskell usa solucionadores SMT. No entanto, o Liquid Haskell também exige termos de prova (ou valores, como são chamados em uma linguagem de tipo não dependente): se você se senta para escrever um programa do Liquid Haskell, escreve suas próprias funções, não apenas os tipos.
[1] http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf
fonte
Tipos dependentes são tipos que dependem de valores de qualquer forma. Um exemplo clássico é "o tipo de vetores de comprimento
n
", onden
é um valor. Tipos de refinamento, como você diz na pergunta, consistem em todos os valores de um determinado tipo que satisfazem um determinado predicado. Por exemplo, o tipo de números positivos. Esses conceitos não são particularmente relacionados (que eu saiba). Obviamente, você também pode ter razoavelmente tipos de refinamento dependentes, como "tipo de todos os números maiores quen
".fonte
0
"?