Все «чистые» функциональные языки сильно типизированы. Есть ли связь между ними?Есть ли связь между функциональным программированием и сильной типизацией?
ответ
Меркурий (в котором вы можете выполнять функциональное программирование, но более чисто логический язык программирования) на самом деле имеет явную систему статической чистоты. Каждый предикат или функция статически известны как чистые или нечистые (или полупустынные, но я не собираюсь подробно останавливаться на этом). Посылка вызова нечистой функции внутри чистой функции (чистый по умолчанию) приведет к обнаружению ошибки во время компиляции.
Он также имеет систему статического типа, в которой тип каждого выражения/переменной статически известен компилятору, а ошибки типа обнаруживаются во время компиляции. Но система типов полностью не зависит от системы чистоты (поскольку вы можете иметь чистые, нечистые и полупустые функции любого типа).
Таким образом, мы можем представить себе другой язык с той же системой статической чистоты, но в котором типы выражений/переменных не статически известны и могут динамически меняться во время выполнения. Можно даже представить такой язык с «слабыми типами» в смысле PHP (т. Е. Язык будет пытаться преобразовать значения, чтобы операции, которые не имеют смысла в типе значения, действительно могут выполняться) или в смысле C (т. Е. Вы можете убедить язык хранить значения одного типа в переменной, которую язык будет обрабатывать, как если бы это был другой тип).
Можно было бы представить себе язык, на котором чистота не была статически известна, но все еще исполнялась во время выполнения. Язык должен был бы сделать что-то вроде отслеживания того, был ли он чистым вызовом, и если это отклоняет призывы к нечистым примитивным операциям.
В этом смысле нет никакой связи между сильной типизацией и чисто программированием.
Однако языки, которые фактически обеспечивают чистоту (а не просто поощряют его, как и в Scala), традиционно достигали этого путем статического анализа. Действительно, одна из мотивов чистого кода заключается в том, что он гораздо более подвержен статическому анализу, чем кодекс, который является нечистым произвольным образом. Надуманным примером является то, что функция, которая принимает логический аргумент и возвращает что-то, может быть известна, чтобы вернуть одно из двух результатов, если оно чисто; если это не известно быть чистым, тогда язык должен предположить, что он может вернуть что-то другое при каждом вызове.И если вы заинтересованы в статическом анализе своего кода, и у вас есть эта система статического анализа для обеспечения чистоты, вы также можете сделать так, чтобы она обеспечивала безопасность типов. Таким образом, существует только «не так много вызовов» для языков, которые обеспечивают чистоту, но не имеют сильных систем статического типа. Я не знаю никого, что на самом деле существует (есть не все, что многие языки, которые, как я знаю, обеспечивают чистоту вообще).
Нетривиальные методы функционального программирования широко используют функции первоклассного и высшего порядка. Первоклассные функции реализуются как закрытие. Нетривиальное использование первоклассных функций и закрытий является только нормальным, когда у вас есть сбор мусора. Эффективная и надежная сборка мусора требует безопасности памяти (которую я предполагаю, что вы подразумеваете под «строго типизированным»). Итак, вы идете.
Чистота на самом деле не имеет для этого значения.
«Чистые» функциональные языки - это те, которые обеспечивают прозрачность ссылок. Приведение в действие может быть статическим (через систему типов), или оно может быть динамическим (например, сбой выполнения). Я предполагаю, что вы имеете в виду «статически типизированный», когда вы говорите «сильно типизированный» ...
Sincbe Сообщество, из которого появилось типичное, чисто функциональное программирование, выпускается отдельно для сокращения ошибок во время выполнения и делает программирование более безопасным добавлением чистоты без типа принудительное исполнение - так что отказ во время выполнения по-прежнему является опцией - нелепо.
Таким образом, нет никаких сюрпризов, которые вы видите, когда типы и эффект печатаются вместе с чистотой по умолчанию: все это связано с уменьшением сбоев во время выполнения.
мускулистые пальцы функциональных программистов, в отличие от этих слабых задних пальцев императивных и динамичных программистов :) –
Вам нужно будет определить «чистый». –
Итак, у вас есть чистый функциональный язык динамического программирования: http://code.google.com/p/pure-lang/ – pyfunc