Может ли рекурсивный статический метод быть оптимизирован хвостовым способом в некотором смысле благодаря тому, что статический метод реализован под прикрытием?
Статические методы не имеют ничего общего с оптимизацией хвостовой рекурсии. Все правила в равной степени применимы к экземпляру и статическим методам, но лично я никогда бы не положился JIT оптимизирует мой хвост. Более того, C # компилятор не выдает команду хвостового вызова, но иногда она все равно выполняется . Короче, вы никогда не знаете .
Компилятор F # поддерживает оптимизацию хвостовой рекурсии и, по возможности, компилирует рекурсию в циклы.
Подробнее о поведении C # и F # в этом вопросе .
Было бы эквивалентно функциональному программированию написать целое приложение со статическими методами и без переменных за пределами локальной области видимости?
Это одновременно нет и да .
Технически, ничто не мешает вам вызывать Console.WriteLine
из статического метода (который сам является статическим методом!), Который, очевидно, имеет побочных эффектов. Ничто также не мешает вам написать класс (с методами экземпляра), который не изменяет никакого состояния (то есть методы экземпляра не обращаются к полям экземпляра). Однако, с точки зрения дизайна, такие методы не имеют смысла как методы экземпляров, верно?
Если вы Add
отправляете элемент в .NET Framework List<T>
(который имеет побочные эффекты), вы измените его состояние.
Если вы append
элемент в список F # , вы получите другой список , и оригинал не будет изменен.
Обратите внимание, что append
действительно - это статический метод для модуля List
. Написание методов «преобразования» в отдельных модулях поощряет проектирование без побочных эффектов, поскольку внутреннее хранилище по определению не доступно , даже если язык это позволяет (F # делает, LISP нет). Однако ничто действительно не мешает вам написать нестатический метод без побочных эффектов .
Наконец, если вы хотите использовать понятия функционального языка, используйте один! Гораздо более естественно писать модули F #, которые работают с неизменяемыми структурами данных F #, чем имитировать то же самое в C # со статическими методами или без них.