Существует ли менее многословная (как в F#) альтернатива C# for.NET а императив ОО?
Я просто люблю F# для задач, которые поддаются функциональному программированию. Я использую C# для императивного OO.
Но становится все более болезненным оставлять невербальную грамматику и вывод типа F# всякий раз, когда переключаешься на C#.
Кто-нибудь знает, есть ли что-то готовящееся для невербального императивного программирования, поскольку синтаксис и вывод типов на самом деле не связаны с императивом против функционала.
4 ответа:
Я не совсем понимаю, что вам не нравится в F#. Хотя он поддерживает функциональный стиль программирования, он также улучшает императивное программирование в .NET во многих отношениях. Я не могу придумать ни одного кода C#, который не может быть заменен функционально идентичным-и намного короче-кодом F# (небезопасный код-единственное исключение, которое приходит на ум).
Даже изменяемый тип, представляющий, например, запись базы данных
class Employee { public Employee(string firstName, string lastName, int age) { this.FirstName = firstName; this.LastName = lastName; this.Age = age; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
Можно свести к следующему в F#:
type Employee = { mutable FirstName : string mutable LastName : string mutable Age : int }
И это должно быть чашкой чая C#.
Когда вы сталкиваетесь с функцией, которой не хватает F#, это обычно предполагает, что есть лучший способ. Сейчас самое время остановиться и проанализировать недостатки типичного императивного подхода.
Действительно, наибольшая сила F#может заключаться в том, что это многопарадигмальный язык. Вы можете использовать OO для структурирования вашего проекта, а функциональное программирование "в малом" для организации ваших модулей-ни один стиль не должен доминировать. Оно просто увеличивает размер твой ящик с инструментами.Если есть конкретные задачи / концепции, которые вы не можете перенести в F#, вы должны упомянуть о них, чтобы другие могли предложить решения.
F# 3.0 получает некоторые функции для лучшей поддержки императивного объектно-ориентированного программирования (что часто требуется при работе с императивными библиотеками .NET для доступа к данным). Он будет иметь автоматически реализованные свойства (см. документацию MSDN):
type MyClass() = let random = new System.Random() member val AutoProperty = random.Next() with get, set member this.ExplicitProperty = random.Next()
Он также позволяет вычислить начальное значение с помощью конструкции
member let
(в отличие от простоmember
, которая повторно оценивает тело каждый раз, когда оно вызывается).F# 3.0 не сделает императивное программирование проще когда речь заходит о мутациях и таких вещах, как
break
иcontinue
в циклах. Я думаю, что акцент на неизменяемом состоянии должен поощрять хороший стиль программирования F#, но об этом было много дискуссий, и вы можете предложить и проголосовать за это.И просто Примечание относительно ваших комментариев, где "чистое функциональное программирование-плохое соответствие". Я думаю, что это действительно зависит от доступных библиотек и ментальной модели, которой вы следуете. Я совершенно убежден, что FP на самом деле довольно хорошо для GUIs, просто нет библиотек F#, которые могли бы это доказать. Вы можете найти этот вопрос интересным: возможно ли функциональное программирование GUI?
В .net есть несколько нишевых языков, которые могут иметь нужные вам свойства.
В частности Бу и Кобра. Они являются языки, которые поддерживают неявная статическая типизация в Python, как синтаксис. Бу, кажется, более популярен, но мне не нравятся некоторые из их вариантов дизайна. Кобра, с другой стороны, выглядит красиво оформленной.
Из-за низкой популярности поддержка IDE довольно слаба, особенно для Cobra.
IronPython и IronRuby с другой стороны, только поддержка динамического набора текста. Это снижает безопасность компиляции и значительно усложняет статический анализ (полезный для Intellisense или рефакторинга).
Я также скажу, что вы, кажется, перепутали понятия императива и ОО-это не одно и то же. С-это императивный язык, но это, конечно, не ОО. И из текстов, цитируемых в этом вопросе, кажется, что доктор Кей действительно имел в виду, что Smalltalk будет функциональным языком, а Smalltalk является прародителем большинства концепций OO. Императивное "свойство" языка ортогонально его объектно-ориентированным свойствам. Так что если вы действительно спрашиваете, будет ли F# имейте лучшую поддержку для ОО, тогда я думаю, что Томас уже ответил на ваш вопрос очень хорошо. Все, что я говорю, это быть осторожным в размышлениях о императивном кодировании и ОО-кодировании-это не одно и то же.