Функциональное программирование в C# по сравнению с [закрытым] LISP

Вместо этого вы можете загрузить предварительно обученные вложения с помощью gensim. По крайней мере, для меня это было намного быстрее. Сначала вам нужно установить gensim с помощью pip, а затем вы можете загрузить модель со следующей строкой кода:

from gensim.models import FastText

model = FastText.load_fasttext_format('cc.en.300.bin')

(я не уверен, нужен ли вам для этого файл .bin, может быть, .vec файл также работает.)

Чтобы получить вложение слова с этой моделью, просто используйте model[word].

31
задан Troy Alford 23 April 2013 в 21:44
поделиться

9 ответов

Выполнение функционального программирования в C# технически возможно (хорошо, любой язык, который имеет указатели функции или делегирует эквивалентный, может быть "функциональным") - но C# становится очень очень болезненным, при попытке сделать много.

Первое, что пришло на ум, без определенного порядка:

  • Вывод типа
    • Только существует для местных жителей теперь
    • , Должен относиться в значительной степени ко всему
    • проблема № 1, которую я имею с C#, это. Особенно, когда Вы объявляете локальную функцию... Func<...> = ай.
  • Полные функции первого класса
    • Делегаты не являются ответом, так как они не структурно эквивалентны. Нет никакого канонического типа для представления функции определенного типа. Исключая: Что такое "инкремент"? Действительно ли это - Func? Действительно ли это - Преобразователь? Это - что-то еще? Это в свою очередь делает вывод более сложным.
  • Автоматическое обобщение
    • Сосет, чтобы должным быть вычислить и указать все универсальные параметры типа и их ограничения
  • , Лучшая поддержка неизменности
    • Делает его тривиальным для объявления простых типов данных
    • материал типа Copy-modify (var x = oldX {SomeField = newVal})
  • Кортежи дизъюнктные объединения C# 7
  • (типы суммы)
  • Сопоставление с образцом , C# 7
    • Делает кортежи, и сумма вводит намного более ценный
    • , Позволяет более ориентированный на выражение код
  • , Общий синтаксис монады
    • Делает вещи как асинхронный код намного легче записать C# 5
    • после вложения 2 + слои BeginXXX/EndXXX это становится довольно ужасным.
  • Легкий синтаксис для функциональных блоков, таким образом, Вы не заканчиваете с заключительными строками как "});})";

Редактирование: Еще один:

  • Композиция функций

    • Прямо сейчас это болезненно, чтобы сделать большую часть любого вида композиции функций. При приправлении карри, объединяя в цепочку, и т.д. LINQ не добирается, как повреждено здесь, потому что дополнительные методы берут первый параметр как метод экземпляра.
  • C# должен испустить tail.call также. Не нужный, JIT добавит последние вызовы сам как соответствующие.

Объекты в [1 134] полужирный были обращены, так как этот ответ был записан.

33
ответ дан 27 November 2019 в 21:34
поделиться

Поддержка неизменности, прежде всего.

должно быть легко создать неизменный тип и проверить, что это неизменно. Это должно быть легко к использование неизменный тип - поддержка как объект и инициализаторы набора, но для неизменного случая.

После этого: лучшие возможности вывода типа, кортежи, сопоставление с образцом и библиотеки поддержки (снова, неизменные списки и т.д.).

РЕДАКТИРОВАНИЕ: Я должен сказать, что я не функциональный программист, но я - программист C#, пытающийся узнавать больше функциональные пути. Я в настоящее время выручаю (скромно) с книгой функционального программирования, таким образом, я изучаю много материала там.

Однако Вы будете, надо надеяться, радоваться с LINQ. Это действительно делает жизнь очень легче для работы с последовательностями данных.

18
ответ дан 27 November 2019 в 21:34
поделиться

На Ваш вопрос, как Lisper, что я пропускаю при программировании в Java (извините, я не использую C#):

  1. Хороший синтаксис: s-выражения.
  2. Динамический контроль типов: никакие объявления составного типа.
  3. Закрытия.

адреса C# (2) и (3) с var и =>, соответственно, насколько я понимаю. Таким образом, мое основное зависание является кюри и точками с запятой, наряду с подробными, запутывающими универсальными описаниями типа.

<час>

На Ваш заголовок, как функциональный программист (Haskell), я пропускаю то, что сказали все те другие парни: неизменность, полный вывод типа, кортежи, сопоставление с образцом, более легкие дженерики, потому что никакое разделение на подклассы, библиотеки со строгим контролем типов.

кроме того, как программист Haskell, мне все еще не нравятся кюри и точки с запятой. :)

9
ответ дан 27 November 2019 в 21:34
поделиться

Если Вы спросите Lisper в противоположность семейству ML функциональный программист, то Вы ничего не услышите о кортежах или выводе. Они скажут одну вещь, самодовольно: МАКРОСЫ.

13
ответ дан 27 November 2019 в 21:34
поделиться

Я, и я делаю. Таким образом, я использую Lisp дома и C# на работе, и я действительно пропускаю Lisp когда в C#. Вопрос немного забавен, потому что я больше не считаю (Общий) Lisp "функциональным", чем C# или Ruby или любой другой язык мультипарадигмы.

В целом, функциональные возможности C# становятся довольно достойными, до такой степени, когда они, вероятно, Достаточно хороши, если немного неловкий. (Поддержка языка Common LISP уверенного функционального программирования не прекрасна, также!), Но язык Common LISP является языком мультипарадигмы; C# не делает (и никогда не может) соответствовать Lisp на синтаксической абстракции, генерации кода, гибкости отправки метода, и так далее.

при поиске оправдания постараться не изучать Lisp, потому что Вы думаете, C# так же мощен, извините. :-)

5
ответ дан 27 November 2019 в 21:34
поделиться

В дополнение к ответу Jon

  1. Кортежи - Кортежи возможны с библиотекой, но он испытывает недостаток во внутреннем синтаксисе, который имеют самые функциональные языки.
  2. Опции - В значительной степени то же как кортежи
  3. Глубокая Поддержка Вывода типа - C# добавил поддержку вывода основного типа в VS 2008, но это ограничено местными жителями в телах метода. Большинство функциональных языков, крыло F#, имеет глубокую поддержку вывода типа, и это действительно делает язык более читаемым, по моему скромному мнению

Eric на том, почему C# не имеет глубокого вывода: http://blogs.msdn.com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx

  1. Хвостовая рекурсия: C# имеет основную поддержку хвостовой рекурсии, но это не внушено на язык. Посмотрите мое сообщение в блоге на том, где хвостовая рекурсия C# и продолжения ломаются

http://blogs.msdn.com/jaredpar/archive/2008/11/10/comparing-continuations-in-f-and-c.aspx

3
ответ дан 27 November 2019 в 21:34
поделиться

Для расширения несколько на точке Jon действительное значение для меня на языках функционального программирования не то, что они имеют, а что они пропускают.

большинство "больших" языков в эти дни имеет (или может быть обманут в наличие), основные примитивы функционального программирования как рекурсия, функции высшего порядка, и т.д. Поэтому, если Вы действительно хотите, можно записать в стиле функционального программирования на большинстве языков (черт, если у Вас есть оптимизация последнего вызова в Вашем компиляторе C, можно в значительной степени написать код функционального стиля в C).

, С другой стороны, то, что также имеют основные языки, является богатством вещей, которые Вы не имеете на чистом языке функционального программирования, и те вещи могут действительно "повредить" функциональную модель и лишить возможности рассуждать о Вашей программе функционального стиля таким же образом, как Вы были бы о чисто-функциональном языке. Изменяемые локальные и глобальные переменные, все paraphenalia вокруг изменяемого параллелизма состояния (традиционное многопоточное программирование), даже повторение, если не справлено, все заставляют Ваш функциональный стиль кодировать нефункциональный (как это было).

Даже при том, что Вы смогли ограничивать себя от неправильного использования функций на Вашем основном языке программирования, довольно маловероятно, что все, кто касается кода со временем, могли бы ограничить себя, таким образом, Вы не можете сделать предположения о функциональности Вашей кодовой базы без действительно полных обзоров кода. Некоторые "нефункциональные" проблемы являются довольно тонкими также так люди, которые хотят написать функциональный код, может ошибиться.

лучший способ удостовериться, Вы функциональны, состоит в том, чтобы выучить и использовать язык функционального программирования. Мне удалось изучить Erlang до такой степени, что я теперь пишу игровой сервер приблизительно через две недели моего очень ограниченного свободного времени, так дело не в этом большая часть проблемы - я полагаю, что языки функционального программирования, после того как Вы переносите голову вокруг фундаментальных понятий, легче выучить, потому что они - настолько больше спартанца.

7
ответ дан 27 November 2019 в 21:34
поделиться

Несколько возвращаемых значений. и "касательно" нечитабельно по сравнению с возвратом кортежей.

Лучшая поддержка неизменности, точно так же, как Jon сказал. Прямо сейчас неизменность на классах возможна из-за человеческой дисциплины.

, Но большей частью недостающей функции является твердая платформа набора, разработанная на основе неизменности.

В моем текущем проекте я ожидал, что неизменность будет большой победой, и это было, но платформа набора является ужасным соответствием.

, Например, скажите, что Вы хотите добавить, что сотрудник к компании, как

public Company AddEmployee(Employee employee)
{
    var newEmployeeList = new List(EmployeeList); 
    newEmployeeList.Add(employee);
    return new Company(newEmployeeList.AsReadOnly(), ....)
}

просто не очень производителен или хорош реализовать.

Однажды, я даже рассмотрел создание моих собственных наборов, запускающихся с простого неизменного класса Недостатков. :)

, С другой стороны, Linq, разработанный очень хороший для нас. Мне действительно нравятся методы, которые это представляет. Я нашел специальный синтаксис Linq не в моем вкусе.

РЕДАКТИРОВАНИЕ: у меня есть слишком низкий разряд для комментария, таким образом, я отвечу на комментарий Jon здесь. Jon, я решил, что это была плохая идея из-за пригодности для обслуживания. У людей, которые поддержат этот проект за следующее десятилетие, вероятно, нет большого количества воздействия Lisp/функционального программирования. Это напоминает мне о другой вещи. Интересно, сколько месяцев обслуживания потребуется, прежде чем мои неизменные объекты становятся изменяемыми. (Правовая оговорка, при этом бизнес IT является чем-то вроде эры золотой лихорадки время от времени, я крайне знаю, что многие разработчик даже не получают, каковы функции как неизменный и закрытия.)

2
ответ дан 27 November 2019 в 21:34
поделиться

Небольшое творчество в сочетании с LINQ (в основном является функциональным языком, встроенным в C #, как становится более очевидным при просмотре DR. Erik Meijers Отличный видео серии на Haskell ) позволит вам сделать ваш код больше функционал.

Вот пример без использования LINQ:

HASKELL:

        minThree :: Int -> Int -> Int -> Int
        minThree x y z 
          | x <= y && x <=z   = x
          | y <=z             = y                      
          | otherwise         = z

C #:

    int MinThree(int x, int y, int z)
    {
        return
              x <= y && x <= z    ? x
            : y <= z              ? y
            : z;

    }

Просто не позволяйте очистку кода RESHARPER запускаемся по вашему коду, как это будет выглядеть так:

    int MinThree(int x, int y, int z)
    {
        return
            x <= y && x <= z
                ? x
                : y <= z
                      ? y
                      : z;
    }

: (

6
ответ дан 27 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: