Хотя это старый вопрос, я думаю, что ни один из ответов пока не упоминает о реальной мотивации для полного функционального программирования, которая такова:
Если программы являются доказательствами, а доказательства являются программами, то программы, которые имеют «дыры», не имеют никакого смысла в качестве доказательств и вводят логическое несоответствие.
По сути, если доказательством является программа, бесконечный цикл может использоваться для доказательства чего угодно . Это действительно плохо, и дает большую часть мотивации для того, почему мы могли бы хотеть программировать полностью. Другие ответы, как правило, не учитывают обратную сторону статьи. В то время как языки технически не завершены, вы можете восстановить множество интересных программ, используя коиндуктивные определения и функции. Мы очень склонны думать о индуктивных данных, но codata служит важной цели в этих языках, где вы можете полностью определить определение, которое является бесконечным (и при выполнении реальных вычислений, которые завершается, вы потенциально можете использовать только конечную часть этого, или, возможно, нет, если вы пишете операционную систему!).
Также следует отметить, что большинство помощников по проверке работают на основе этого принципа, например, Coq.