A digitação dependente (Full) permite que você escreva expressões arbitrárias no nível de tipo incluindo aquelas que, em uma linguagem mais "mainstream", seriam exclusivas do nível de valor. Isso permite que você escreva pré e pós-condições com verificação de tipo para suas funções, mas apenas como um caso especial de poder escrever qualquer coisa que você goste .
Por outro lado, "contratos" só pode fazer uma verificação muito específica, ao contrário de verificar literalmente qualquer coisa que você possa conceber (contanto que seja computável).
Os chamados "tipos de refinamento" estão em algum lugar entre os dois.