A questão é: como você elimina termos que são executados para sempre:
Em particular, coisas como e o combinador Y NÃO devem estar no seu idioma, pois podem ser usadas para construir cálculos que não param.( λ x . x x ) ( λ x . x x )
A digitação estática em coisas como o Sistema F elimina estas: elas começam com um cálculo lambda completo e depois filtram termos incorretos.
Mas, faça isso em uma configuração não digitada, você precisará eliminar esses termos por construção . Eles não podem ser expressáveis no seu idioma.
Eu posso pensar em algumas maneiras tolas de fazer isso, como a linguagem de programas imperativos sem funções ou e apenas repetindo as listas. Mas, em geral, assim que você tem funções de ordem superior, essas construções problemáticas são construtíveis. Portanto, embora não diga que é impossível, provavelmente é muito difícil de fazer de uma maneira que faça muito sentido.
É possível filtrar estaticamente essas coisas com algo que não é um sistema de tipos, com verificadores de terminação, mas sempre geram falsos positivos e, embora não sejam de digitação estática, ainda são muito um filtro estático. seus programas.
Observe que, dependendo do que você considera "digitado dinamicamente", você pode eliminar programas como esse acompanhando os tipos usando inferência, mas apenas lançando erros em tempo de execução. Assim, algo como o combinador Y ainda é rejeitado, apenas mais tarde. Isso é digitado dinamicamente, mas provavelmente não é o que você está procurando.